有没有一种方法可以计算同一 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.&#xa;')" />
    <xsl:copy-of select="$output" />
</xsl:template>

它的输出是

Outputting 5 elements.
<ABC>
    <ZZZ>Some Grandchild</ZZZ>
</ABC>
<DEF/>
<GHI/>
... 
<YZ/>

这段代码完成了三件事:

  1. 首先它生成结果并将其放入变量

  2. 它计算所有

    • children(child::*轴)或
    • 后代(descendant::*轴)如上例

    变量中的元素

  3. 它将变量复制到输出流

这种方法甚至可以嵌套 - 这意味着它可以一个接一个地应用多次。

您的选择是:

(a) 找到一种计算结果作为输入函数的方法

(b) 捕获变量中的输出,运行 针对该变量的第二阶段处理。

(c) 以上的混合:在一个变量中计算一些中间结果,并将该变量用作两个过程的输入。

在您给出的示例中,第一种方法非常有效;但我想你真正的问题比这更复杂,否则你不会问。