Другой способ это может быть достигнуто с помощью 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
, используя ключ
<xsl:apply-templates select="key('values', position() - 1)" />
Единственный реальный беспорядочный бит - это то, как вы сопоставляете атрибут «Лицо» name
, чтобы вывести элемент «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
это решение также довольно общий характер.