XSLT:XSLT 1.0 何时需要不止一种转换?

XSLT: When more than one transformation is needed with XSLT 1.0?

XML 文件看起来是这样的:

<ROOT>
    <A>
        <B>
            <F name="Sandra"/>
            <F name="1234"/>
        </B>
        <C>
            <F name="Peter"/>
        </C>
    </A>
    <A>
        <B>
            <F name="Peter"/>
            <F name="nameles"/>
        </B>
        <C>
            <F name="1234"/>
        </C>
    </A>
</ROOT>

这就是 xsl:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html"/>
<xsl:template match="/">
  <html>
  <body>    
        <table>
            <xsl:for-each select="//F">
                <tr>
                    <td>
                        <xsl:value-of select="@name"/>
                    </td>
                    <td>
                        <xsl:if test="ancestor::B">
                        <!-- doing something-->
                        </xsl:if>
                    </td>
                </tr>
            </xsl:for-each>
        </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet> 

第一个目标是让 HTML 和 table 在一个列中包含 <F/> 元素的所有 name。在第二列中,检查父节点,如果 <F/> 元素是例如包含在 <B/> 元素中的特定值被设置。 提取工作正常,并且还得到了父节点的检查。 我正在检查完整文件中每个 <F/> 元素的相对值。

我现在的问题是我得到一个未排序的 table。

  1. 是否可以将漏洞 table 存储在一个变量中,并使用第二种样式 sheet 模板在额外的步骤中进行排序?

最后需要查看哪些 <F/> 同名元素存在,但不包含在 <B/> 元素中。

  1. 此外,算法很清楚,但是是否可以在一个 XSLT 转换中完成步骤 1) 和 2)?

或更笼统的问题,何时至少必须完成第二次 XSLT 转换?

此致

回答标题问题,您始终可以 运行 通过使用变量和模式在单个样式表中进行 multi-phase 转换——除非您使用的是 XSLT 1.0,否则您将需要exsl:node-set() 扩展,将您在变量中捕获的第一阶段的结果转换为可以在第二阶段处理的 node-set。

是在一个样式表中执行此操作更好,还是在管道中链接在一起的多个样式表中执行此操作是另一个问题。使用多个样式表使您的代码更加模块化和可重用,并且更容易调试,但部署起来有点棘手。折衷方案是在单独的样式表模块中进行每个处理阶段,然后使用 top-level 模块(即 includes/imports 其他模块)进行整体协调。