Во-первых, я думаю, что ваша maxRows
переменная может быть упрощена до этого
<xsl:variable name="maxRows" select="max(//Row/count(key(hostNameByValue, Hostname)))" />
Где я определил ключ hostNameByValue
так:
<xsl:key name="hostNameByValue" match="Row" use="Hostname"/>
Вы также можете использовать distinct-values
, чтобы получить отдельные имена столбцов
<xsl:variable name="cols" select="distinct-values(//Row/Hostname)" />
Таким образом, предполагая, что $rowNum
является текущим числом (в блоке <xsl:for-each select="1 to $maxRows">
код для получения текущего значения ячейки будет следующим:
<xsl:for-each select="$cols">
<th><xsl:value-of select="key('hostNameByValue', ., $doc)[position() = $rowNum]/VLAN"/></th>
</xsl:for-each>
(где $doc
- это ссылка на исходный документ XML, поскольку в xsl:for-each
теперь есть последовательность атомарных значений)
Попробуйте это XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="xml" indent="yes" />
<xsl:key name="hostNameByValue" match="Row" use="Hostname"/>
<xsl:variable name="cols" select="distinct-values(//Row/Hostname)" />
<xsl:variable name="maxRows" select="max(//Row/count(key('hostNameByValue', Hostname)))" />
<xsl:variable name="doc" select="/" />
<xsl:template match="DocumentRoot">
<table>
<tr>
<xsl:for-each select="$cols">
<th><xsl:value-of select="."/></th>
</xsl:for-each>
</tr>
<xsl:for-each select="1 to $maxRows">
<xsl:variable name="rowNum" select="position()"/>
<tr>
<xsl:for-each select="$cols">
<th><xsl:value-of select="key('hostNameByValue', ., $doc)[position() = $rowNum]/VLAN"/></th>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
См. В действии на http://xsltfiddle.liberty -development.net / 6r5Gh3N