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。
- 是否可以将漏洞 table 存储在一个变量中,并使用第二种样式 sheet 模板在额外的步骤中进行排序?
最后需要查看哪些 <F/>
同名元素存在,但不包含在 <B/>
元素中。
- 此外,算法很清楚,但是是否可以在一个 XSLT 转换中完成步骤 1) 和 2)?
或更笼统的问题,何时至少必须完成第二次 XSLT 转换?
此致
回答标题问题,您始终可以 运行 通过使用变量和模式在单个样式表中进行 multi-phase 转换——除非您使用的是 XSLT 1.0,否则您将需要exsl:node-set() 扩展,将您在变量中捕获的第一阶段的结果转换为可以在第二阶段处理的 node-set。
是在一个样式表中执行此操作更好,还是在管道中链接在一起的多个样式表中执行此操作是另一个问题。使用多个样式表使您的代码更加模块化和可重用,并且更容易调试,但部署起来有点棘手。折衷方案是在单独的样式表模块中进行每个处理阶段,然后使用 top-level 模块(即 includes/imports 其他模块)进行整体协调。
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。
- 是否可以将漏洞 table 存储在一个变量中,并使用第二种样式 sheet 模板在额外的步骤中进行排序?
最后需要查看哪些 <F/>
同名元素存在,但不包含在 <B/>
元素中。
- 此外,算法很清楚,但是是否可以在一个 XSLT 转换中完成步骤 1) 和 2)?
或更笼统的问题,何时至少必须完成第二次 XSLT 转换?
此致
回答标题问题,您始终可以 运行 通过使用变量和模式在单个样式表中进行 multi-phase 转换——除非您使用的是 XSLT 1.0,否则您将需要exsl:node-set() 扩展,将您在变量中捕获的第一阶段的结果转换为可以在第二阶段处理的 node-set。
是在一个样式表中执行此操作更好,还是在管道中链接在一起的多个样式表中执行此操作是另一个问题。使用多个样式表使您的代码更加模块化和可重用,并且更容易调试,但部署起来有点棘手。折衷方案是在单独的样式表模块中进行每个处理阶段,然后使用 top-level 模块(即 includes/imports 其他模块)进行整体协调。