XSL xsl:模板匹配="/"
Posted
技术标签:
【中文标题】XSL xsl:模板匹配="/"【英文标题】:XSL xsl:template match="/" 【发布时间】:2011-03-08 19:30:59 【问题描述】:我只是在学习 XML 以及如何使用 XSL 文件。 在一个 XSL 文件中,我发现了以下术语:
xsl:template match="/"
这代表什么?
我可以用什么来代替/
?
我可以写 table
或任何其他 html 标签来代替 /
吗?
【问题讨论】:
【参考方案1】:<xsl:template>
指令的match
属性的值必须是匹配模式。
匹配模式构成所有可能的 XPath 表达式集的子集。第一个自然的限制是匹配模式必须选择一组节点。还有其他限制。特别是,定位步骤中不允许使用反向轴(但可以在谓词中指定)。此外,在 XSLT 1.0 中不允许使用变量或参数引用,但在 XSLT 2.x 中使用这些是合法的。
XPath 中的/
表示 root 或文档节点。在 XPath 2.0(以及 XSLT 2.x)中,这也可以写成document-node()
。
匹配模式可以包含//
abbreviation。
匹配模式示例:
<xsl:template match="table">
可以应用于任何名为table
的元素。
<xsl:template match="x/y">
可以应用于任何名为 y
的元素,其父元素是名为 x
的元素。
<xsl:template match="*">
可以应用于任何元素。
<xsl:template match="/*">
只能应用于 XML 文档的顶部元素。
<xsl:template match="@*">
可以应用于任何属性。
<xsl:template match="text()">
可以应用于任何文本节点。
<xsl:template match="comment()">
可以应用于任何评论节点。
<xsl:template match="processing-instruction()">
可应用于任何处理指令节点。
<xsl:template match="node()">
可以应用于任何节点:元素、文本、注释或处理指令。
【讨论】:
了解这一点很有帮助,并且在其他来源中很少提及:“如果节点是针对某些可能的上下文将模式评估为表达式的结果的成员,则该节点匹配模式;可能的上下文是那些上下文节点是被匹配的节点或其祖先之一的上下文。” (w3.org/TR/xslt#patterns) @NiklasPeter,是的,这里的规范解释了 XPath 表达式是如何计算的——所以我们需要提到任何 XSLT 程序员都应该知道 XPath 吗?我想每个人都非常清楚这个先决条件。 我之所以添加这句话是因为它的最后一部分:“可能的上下文是那些上下文节点是被匹配的节点或其祖先之一的上下文。”。我认为尝试所有的祖先节点是 XSLT 特有的,而不是事实,不是每个熟悉 XPath 的人都知道。 @NiklasPeter,规范中的这段摘录是一种令人费解的说法,即匹配模式可以以(和/或包含)//
缩写开头。 W3C 规范因对最终用户造成混淆和“信息丰富”而臭名昭著。
或者我错了,我们可以向 @Michel-kay 询问他的解释。【参考方案2】:
值得注意的是,由于 XML 文档的根(或文档节点)不是***元素,这会让刚接触 XML 的人感到困惑。它是***元素的父级。这很令人困惑,因为***元素似乎不能有父元素。不是***吗?
但是看看这个,一个格式良好的 XML 文档:
<?xml-stylesheet href="my_transform.xsl" type="text/xsl"?>
<!-- Comments and processing instructions are XML nodes too, remember. -->
<TopLevelElement/>
这个文档的根有三个孩子:一个处理指令、一个注释和一个元素。
因此,例如,如果您想编写一个删除该注释的转换,但保留在文档中其他任何位置出现的任何 cmets 中,您可以将其添加到身份转换:
<xsl:template match="/comment()"/>
更简单(并且更常用),这里有一个 XPath 模式,它匹配文档的***元素,无论其名称如何:/*
。
【讨论】:
今天早上我花了很多时间被这个文档/根元素的二分法完全搞糊涂了。多年来我一直在使用 XML 和 DOM,但仍然会遇到这样的事情! 感谢您让我了解这个微妙但基本的区别,我已经忘记了太久! :) 哇,我使用 xslt 已经 7 年了,我还不知道这一点。【参考方案3】:match 属性指示模板转换将应用于哪些部分。在这种特殊情况下,“/”表示 xml 文档的根。您必须提供给 match 属性的值应该是 XPath 表达式。 XPath 是您必须使用的语言来引用目标 xml 文件的特定部分。
要有意义地了解您还可以在 match 属性中添加什么内容,您需要了解 Xpath 是什么以及如何使用它。我建议您查看我在答案底部为您提供的链接。
我可以写
table
或任何其他html
标签来代替“/
”吗?
是的,你可以。但这取决于您到底要做什么。如果您的目标 xml 文件包含 HTML 元素,并且您尝试在它们上应用此 xsl:template
,则使用 table
、div
或其他任何东西是有意义的。
这里有几个链接:
XSL templates XPath 一本关于 XML 的好书 - Beginning XML【讨论】:
这个答案实际上并不正确。并非每个 XPath 表达式都可以指定为合法的匹配模式。 我同意,但我认为初学者最好考虑使用 XPath 定义的匹配模式。以上是关于XSL xsl:模板匹配="/"的主要内容,如果未能解决你的问题,请参考以下文章