这可以实现另一种方式是通过使用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
这种解决方案也相当一般。