XSLT:何时需要使用 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,其中包含
的所有 name
> 一列中的元素。在第二列中,检查父节点,如果
元素包含在 元素中,则设置某个值。 提取工作正常,并且还得到父节点的检查。 我正在检查完整文件中每个
元素的相对值。
我的问题是现在我得到一个未排序的表。
- 是否可以将孔表存储在变量中并使用第二个样式表模板在额外的步骤中进行排序?
最后,需要查看哪些
具有相同名称的元素存在,但不包含在 元素中。
- 另外,该算法很清晰,但是否可以在一个 XSLT 转换中完成步骤 1) 和 2)?
或者更笼统地问,什么时候必须至少进行第二次 XSLT 转换?
问候
the XML file looks so:
<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>
and that´s the 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>
The first target is to have an HTML with a table which contains all name
s of the <F/>
elements in one colum. In the second colum the parent node is checked and if the <F/>
element is e.g. contained in the <B/>
element a certain value is set.
The extraction works fine and also getting getting the check of the parent node.
I'm checking relative for each <F/>
element in the complete file.
My problem is now that I get an unsorted table.
- Is it possible to store the hole table in a variable and sort in extra step with a second style sheet template?
Finally it is needed to see which <F/>
elements with the same name exist, but are not containded in a <B/>
element.
- Also for that the algorithm is clear, but is it possible to make step 1) and 2) in one XSLT transformation?
Or more general asked, when at least a second XSLT transformation must be done?
Regards
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
回答标题问题,您始终可以使用变量和模式在单个样式表中运行多阶段转换 - 除非您使用 XSLT 1.0,否则您将需要 exsl:node-set() 扩展来将您将第一阶段的结果捕获到变量中,并将其放入可在第二阶段处理的节点集中。
是在一个样式表中执行更好还是在管道中链接在一起的多个样式表中执行更好是另一个问题。使用多个样式表使您的代码更加模块化和可重用,并且更易于调试,但部署起来有点棘手。一种折衷方案是在单独的样式表模块中进行每个处理阶段,然后使用顶级模块(包括/导入其他模块)来进行整体协调。
Answering the headline question, you can always run a multi-phase transformation within a single stylesheet by using variables and modes --except that if you're using XSLT 1.0, you will need the exsl:node-set() extension to turn the result of the first phase, which you capture in a variable, into a node-set that can be processed in the second phase.
Whether it's better to do it one stylesheet or in multiple stylesheets chained together in a pipeline is another question. Using multiple stylesheets makes your code more modular and reusable, and easier to debug, but a bit trickier to deploy. A compromise is to do each phase of processing in a separate stylesheet module, and then use a top-level module (that includes/imports the others) to do the overall coordination.