【发布时间】:2018-10-23 10:52:50
【问题描述】:
TL;DR:如何使用 XPath 表示 <apply-templates /> 语句?
我有一个整理信息的模板。我想以不止一种不同的方式进一步处理这些信息,所以我想知道是否有一种方法可以从 XSLT 中的模板“返回”。
示例:我有一个 XHTML sn-p:
<page html:xmlns="html namespace">
<html:p>
The <html:a href="/foo">Tropical Foo</html:a> uses <html:a href="bar-language">Bar</html:a> to implement <html:a href="/programs/fizzbuzz>FizzBuzz</html:a>
</html:p>
</page>
我有一个模板可以从 HTML sn-p 中提取带有href 的<a> 标记。我想重复使用两次来预取页面和添加一个“链接”栏,如下所示:
<html>
<head>
<link rel="prefetch" href="/foo" />
<link rel="prefetch" href="bar-language" />
<link rel="prefetch" href="/programs/fizzbuzz" />
</head>
<body>
<main>
<p>
The <a href="/foo">Tropical Foo</a> uses <a href="bar-language">Bar</a> to implement <a href="/programs/fizzbuzz>FizzBuzz</a>
</p>
</main>
<aside>
<h2>Linked</h2>
<ul>
<li><a href="/foo">Tropical Foo</a></li>
<li><a href="bar-language">Bar</a></li>
<li><a href="/programs/fizzbuzz>FizzBuzz</a></li>
</ul>
</aside>
</body>
</html>
这在 XSLT 1.0 中是否可行?
如果它更容易,我有一个相关的问题变体,我正在使用样式表转换整个文档,然后想要使用转换后的版本。我知道我可以<xsl:include> 其他文档转换样式表并写<xsl:apply-templates select="document('other.xml')"/>,但我想进一步转换这个结果。
【问题讨论】:
-
那么,您如何使用该模板“从 HTML sn-p 中提取带有 href 的
<a>标记”看起来准确,它返回什么?您希望能够以什么方式使用中间结果两次?当然,给定 XSLT 1,您是否希望在使用或不使用exsl:node-set之类的扩展函数的情况下进一步处理节点形式的中间结果?您当然可以推送相同的 XPath 选择(例如//xhtml:a[@href]) 到不同的模板,使用模式将相同的输入节点两次或多次转换为不同的输出。 -
@MartinHonnen 该模板实际上是
<xsl:copy-of select="html:a[@href]" />,但我希望它适用于更复杂的示例。 -
那没有意义,输入有一些没有真正拼出的命名空间,你显示的结果没有任何命名空间。所以一个简单的
xsl:copy-of永远不会处理特定命名空间中的输入以获得没有命名空间的结果。当然,另一方面,如果你想要的只是选择输入节点,那么你不需要模板使用变量<xsl:variable name="links" select="html:a[@href]"/>,然后将变量推送到具有不同模式的不同模板以构建不同的演示文稿。跨度> -
@MartinHonnen
xsl:variable定义非常适合 XPath 表达式,但是如果我想在其他地方定义 XPath 表达式怎么办?如果我想要比简单的 XPath 表达式更复杂的东西怎么办? -
我认为我们不能而且应该在这里重写有关 XSLT 的教程,例如参见第 3 章 XPath 数据模型中的书 cranesoftwrights.github.io/books/ptux/index.htm,解释了 XSLT 1 的限制,其中“不能推或拉”结果树片段的节点”。但正如我已经指出的,有像
exsl:node-set这样的扩展函数可以将结果树片段转换为节点集。因此,对于某个 XSLT 1.0 处理器,您通常可以使用这样的功能。
标签: xml xslt xpath foreach return