Вы хотите получить следующее выражение ...
<xsl:value-of select="*[local-name() = $name][lower-case(@attribute)='attr1']"/>
... За исключением этого произойдет сбой с ошибкой вдоль строк Required item type of context item for the child axis is node(); supplied expression (.) has item type xs:integer
, из-за кода, выполняемого в контексте xsl:for-each
для атомарных значений. Чтобы обойти это, вам нужно сохранить ссылку на дочерние элементы в переменной до xsl:for-each
.
Попробуйте это XSLT
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="root">
<html>
<body>
<h2>My Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th style="text-align:left">Title</th>
</tr>
<xsl:variable name="children" select="*" />
<xsl:for-each select="1 to 10">
<xsl:variable name="name" select="concat('element', .)"/>
<tr>
<td>
<xsl:value-of select="$children[local-name() = $name][lower-case(@attribute)='attr1']"/>
</td>
<td>
<xsl:value-of select="$children[local-name() = $name][lower-case(@attribute)='attr2']"/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Или немного лучше, чтобы уменьшить дублирование кода ...
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="root">
<html>
<body>
<h2>My Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th style="text-align:left">Title</th>
</tr>
<xsl:variable name="children" select="*" />
<xsl:for-each select="1 to 10">
<xsl:variable name="name" select="concat('element', .)"/>
<xsl:variable name="element" select="$children[local-name() = $name]"/>
<tr>
<td>
<xsl:value-of select="$element[lower-case(@attribute)='attr1']"/>
</td>
<td>
<xsl:value-of select="$element[lower-case(@attribute)='attr2']"/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Обратите внимание, я бы действительно подумал об изменении вашего входного XML, если у вас есть контроль над ним. Нумерация элементов с использованием имени элемента затрудняет манипулирование. В идеале вы бы сделали это вместо ...
<ns:element num="1" attribute="attr1">10</ns:element>