有没有一种方法可以计算同一 XSL 中由 XSL 生成的元素?
Is there a way to count the elements generated by an XSL within the same XSL?
如果我有一个 XSL 创建这样的输出 simple/rough 示例:
<Parent1>
<ABC><xsl:value-of select="SomeValue1"/></ABC>
<DEF><xsl:value-of select="SomeValue2"/></DEF>
<GHI><xsl:value-of select="SomeValue3"/></GHI>
...
<YZ><xsl:value-of select="SomeValue9"/></YZ>
</Parent1>
...在同一个 XSL 中,我如何计算 XSL 将生成多少 children?
您可以将您的内容生成到一个变量中,计算变量中的子项,然后发出变量的内容:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/">
<xsl:variable name="temp-results">
<Parent1>
<ABC><xsl:value-of select="SomeValue1"/></ABC>
<DEF><xsl:value-of select="SomeValue2"/></DEF>
<GHI><xsl:value-of select="SomeValue3"/></GHI>
...
<YZ><xsl:value-of select="SomeValue9"/></YZ>
</Parent1>
</xsl:variable>
<xsl:text>Number of children:</xsl:text>
<xsl:value-of select="count($temp-results/Parent1/*)"/>
<xsl:sequence select="$temp-results"/>
</xsl:template>
</xsl:stylesheet>
一种可能是将整个输出过程包装在一个变量中,然后计算它的后代。
因此,例如,您可以使用以下 XSLT 代码
<xsl:template match="/Parent1">
<xsl:variable name="output">
<ABC><xsl:value-of select="SomeValue1"/><ZZZ>Some Grandchild</ZZZ></ABC>
<DEF><xsl:value-of select="SomeValue2"/></DEF>
<GHI><xsl:value-of select="SomeValue3"/></GHI>
...
<YZ><xsl:value-of select="SomeValue9"/></YZ>
</xsl:variable>
<xsl:value-of select="concat('Outputting ', count($output/descendant::*), ' elements.
')" />
<xsl:copy-of select="$output" />
</xsl:template>
它的输出是
Outputting 5 elements.
<ABC>
<ZZZ>Some Grandchild</ZZZ>
</ABC>
<DEF/>
<GHI/>
...
<YZ/>
这段代码完成了三件事:
首先它生成结果并将其放入变量
它计算所有
- children(
child::*
轴)或
- 后代(
descendant::*
轴)如上例
变量中的元素
它将变量复制到输出流
这种方法甚至可以嵌套 - 这意味着它可以一个接一个地应用多次。
您的选择是:
(a) 找到一种计算结果作为输入函数的方法
(b) 捕获变量中的输出,运行 针对该变量的第二阶段处理。
(c) 以上的混合:在一个变量中计算一些中间结果,并将该变量用作两个过程的输入。
在您给出的示例中,第一种方法非常有效;但我想你真正的问题比这更复杂,否则你不会问。
如果我有一个 XSL 创建这样的输出 simple/rough 示例:
<Parent1>
<ABC><xsl:value-of select="SomeValue1"/></ABC>
<DEF><xsl:value-of select="SomeValue2"/></DEF>
<GHI><xsl:value-of select="SomeValue3"/></GHI>
...
<YZ><xsl:value-of select="SomeValue9"/></YZ>
</Parent1>
...在同一个 XSL 中,我如何计算 XSL 将生成多少 children?
您可以将您的内容生成到一个变量中,计算变量中的子项,然后发出变量的内容:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/">
<xsl:variable name="temp-results">
<Parent1>
<ABC><xsl:value-of select="SomeValue1"/></ABC>
<DEF><xsl:value-of select="SomeValue2"/></DEF>
<GHI><xsl:value-of select="SomeValue3"/></GHI>
...
<YZ><xsl:value-of select="SomeValue9"/></YZ>
</Parent1>
</xsl:variable>
<xsl:text>Number of children:</xsl:text>
<xsl:value-of select="count($temp-results/Parent1/*)"/>
<xsl:sequence select="$temp-results"/>
</xsl:template>
</xsl:stylesheet>
一种可能是将整个输出过程包装在一个变量中,然后计算它的后代。
因此,例如,您可以使用以下 XSLT 代码
<xsl:template match="/Parent1">
<xsl:variable name="output">
<ABC><xsl:value-of select="SomeValue1"/><ZZZ>Some Grandchild</ZZZ></ABC>
<DEF><xsl:value-of select="SomeValue2"/></DEF>
<GHI><xsl:value-of select="SomeValue3"/></GHI>
...
<YZ><xsl:value-of select="SomeValue9"/></YZ>
</xsl:variable>
<xsl:value-of select="concat('Outputting ', count($output/descendant::*), ' elements.
')" />
<xsl:copy-of select="$output" />
</xsl:template>
它的输出是
Outputting 5 elements.
<ABC>
<ZZZ>Some Grandchild</ZZZ>
</ABC>
<DEF/>
<GHI/>
...
<YZ/>
这段代码完成了三件事:
首先它生成结果并将其放入变量
它计算所有
- children(
child::*
轴)或 - 后代(
descendant::*
轴)如上例
变量中的元素
- children(
它将变量复制到输出流
这种方法甚至可以嵌套 - 这意味着它可以一个接一个地应用多次。
您的选择是:
(a) 找到一种计算结果作为输入函数的方法
(b) 捕获变量中的输出,运行 针对该变量的第二阶段处理。
(c) 以上的混合:在一个变量中计算一些中间结果,并将该变量用作两个过程的输入。
在您给出的示例中,第一种方法非常有效;但我想你真正的问题比这更复杂,否则你不会问。