循环中的 XSLT 动态节点名称
有谁知道是否可以循环遍历模板并根据迭代数提取节点值。例如,我有以下 XML 结构:
<nodes>
<node>
<label1>Label a</label1>
<value1>Value a</value1>
<label2>Label b</label2>
<value2>Value b</value2>
<label3>Label c</label3>
<value3>Value c</value3>
etc...
</node>
</nodes>
始终有 20 个标签/值对数据。我想通过 XSLT 将这些输出到表中。通过循环遍历模板 20 次(除非有更好的方法)。
我下面的代码可以工作,但在输出值时它不接受动态数字(例如
<xsl:value-of select="$node/label$index"/>
)
这是到目前为止的代码:
<xsl:param name="currentPage"/>
<xsl:variable name="numberOfPairs" select="20" />
<xsl:template match="/">
<table>
<xsl:call-template name="outputData">
<xsl:with-param name="node" select="$currentPage" />
</xsl:call-template>
</table>
</xsl:template>
<xsl:template name="outputData">
<xsl:param name="node" select="." />
<xsl:param name="index" select="1" />
<tr>
<td><xsl:value-of select="$node/label1"/></td>
<td><xsl:value-of select="$node/value1"/></td>
</tr>
<xsl:if test="$index <= $numberOfPairs">
<xsl:call-template name="outputData">
<xsl:with-param name="node" select="$node" />
<xsl:with-param name="index" select="$index + 1" />
</xsl:call-template>
</xsl:if>
</xsl:template>
任何人都可以提出解决方案吗?
Does anyone know if it's possible to loop through a template and pull out node values based on an iterating number. So for example, I have the following XML strucutre:
<nodes>
<node>
<label1>Label a</label1>
<value1>Value a</value1>
<label2>Label b</label2>
<value2>Value b</value2>
<label3>Label c</label3>
<value3>Value c</value3>
etc...
</node>
</nodes>
There are always 20 label/value pairs of data. I want to output these via XSLT in a table. By looping through a template 20 times (unless there's a better way).
The code I have below works, but it won't accept a dynamic number when outputting the values (e.g.
<xsl:value-of select="$node/label$index"/>
)
Here's the code so far:
<xsl:param name="currentPage"/>
<xsl:variable name="numberOfPairs" select="20" />
<xsl:template match="/">
<table>
<xsl:call-template name="outputData">
<xsl:with-param name="node" select="$currentPage" />
</xsl:call-template>
</table>
</xsl:template>
<xsl:template name="outputData">
<xsl:param name="node" select="." />
<xsl:param name="index" select="1" />
<tr>
<td><xsl:value-of select="$node/label1"/></td>
<td><xsl:value-of select="$node/value1"/></td>
</tr>
<xsl:if test="$index <= $numberOfPairs">
<xsl:call-template name="outputData">
<xsl:with-param name="node" select="$node" />
<xsl:with-param name="index" select="$index + 1" />
</xsl:call-template>
</xsl:if>
</xsl:template>
Can anyone suggest a solution to this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
输出:
Output:
此转换:
应用于此 XML 文档时(与提供的类似,但具有 21 个标签值对):
产生所需的正确结果:
说明:
使用标准 XPath 函数
name()
、starts-with()
和substring-after()
要显示的最大对数在名为
pLimit
的全局(外部)参数中提供。该解决方案的核心是将模板精确地应用到我们想要显示的一组
Labelxx
元素上。这些是深度为 3 的任何元素,其名称以字符串"label"
开头,并且起始字符串"label"
后面的名称的剩余部分是一个数字,不大于指定的限制$pLimit
。This transformation:
when applied on this XML document (similar to the provided, but with 21 label-value pairs):
produces the wanted, correct result:
Explanation:
Using the standard XPath functions
name()
,starts-with()
andsubstring-after()
The maximum number of pairs to display is provided in the global (external) parameter named
pLimit
.The core of the solution is applying templates exactly on the set of
Labelxx
elements that we want to display. These are any elements at depth 3 whose name starts with the string"label"
and where the remaining part of the name that follows the starting string"label"
is a number that is not greater than the specified limit$pLimit
.