這可以實現另一種方式是通過使用xsl:key
基於自己的立場來查找val
元素
<xsl:key name="values" match="val" use="count(preceding-sibling::val)" />
這樣,你會遍歷val
元素在第一table
<xsl:for-each select="table[1]/tuple/val">
然後,您可以使用關鍵字
獲取將構成
data
元素的所有
val
元素0
<xsl:apply-templates select="key('values', position() - 1)" />
唯一真正的混亂點是你如何映射name
屬性「Person」來輸出一個「name」元素。
試試這個XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:key name="values" match="val" use="count(preceding-sibling::val)" />
<xsl:template match="/row">
<row>
<xsl:for-each select="table[1]/tuple/val">
<data>
<xsl:apply-templates select="key('values', position() - 1)" />
</data>
</xsl:for-each>
</row>
</xsl:template>
<xsl:template match="val">
<xsl:variable name="name">
<xsl:choose>
<xsl:when test="../../@name = 'Person'">name</xsl:when>
<xsl:otherwise><xsl:value-of select="translate(../../@name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')" /></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:element name="{$name}">
<xsl:value-of select="." />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
除了凌亂xsl:choose
這種解決方案也相當一般。