XSL:`xsl:template` 中 `match="/" `的含义是什么?

66

我只是在学习XML和如何使用XSL文件。 在一个XSL文件中,我找到了以下术语:

xsl:template match="/"

这是什么意思? 而且,我可以用什么代替 /? 我能否使用 table 或其他 HTML 标签来代替 /
3个回答

135
< p > < code >match 属性的值必须是一个 匹配模式

匹配模式是所有可能 XPath 表达式的子集。第一个自然的限制是匹配模式必须选择一组节点。还有其他限制,特别是在位置步骤中不允许使用反向轴(但可以在谓词中指定)。此外,在 XSLT 1.0 中不允许使用变量或参数引用,但在 XSLT 2.x 中使用这些是合法的。

XPath 中的/表示根或文档节点。在 XPath 2.0(因此也在 XSLT 2.x 中),可以将其写为document-node()

匹配模式可以包含//缩写

匹配模式的示例:

<xsl:template match="table">

可以应用于任何名为table的元素。

<xsl:template match="x/y">

该属性可应用于任何名为 x 的父元素下的名为 y 的元素。

<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()">

该方法可应用于任何节点:元素、文本、注释或处理指令。


这是一个有用的知识点,在其他资料中很少提到:“如果一个节点是在将模式作为表达式相对于某个可能的上下文进行评估的结果的成员,则该节点与该模式匹配;可能的上下文是那些上下文节点是被匹配的节点或其祖先之一。”(https://www.w3.org/TR/xslt#patterns) - Niklas Peter
@NiklasPeter,是的,在这里规范说明了XPath表达式如何计算--所以我们需要提到任何XSLT程序员都需要知道XPath吗?我认为每个人都非常清楚这个前提条件。 - Dimitre Novatchev
我添加这个引用的原因是其中的最后一部分:“可能的上下文是匹配节点或其祖先之一的上下文节点。”我认为尝试所有祖先节点是特定于XSLT而不是所有人都熟悉XPath的事实。 - Niklas Peter
@NiklasPeter,这个规范摘录用了一种复杂的方式来表达匹配模式可以以(和/或包含)//缩写开头。W3C规范以令人困惑和“信息量大”而闻名于世。 - Dimitre Novatchev
或者我可能错了,我们可以询问@Michel-kay他的解释。 - Dimitre Novatchev

48

值得注意的是,对于新手来说XML很容易让人感到困惑,文档的根节点(或文档节点)不是顶层元素,而是顶层元素的父节点。这很容易导致混淆,因为似乎顶层元素没有父节点。但看看这个格式良好的XML文档:

<?xml-stylesheet href="my_transform.xsl" type="text/xsl"?>
<!-- Comments and processing instructions are XML nodes too, remember. -->
<TopLevelElement/>

这个文档的根有三个子节点:一个处理指令、一个注释和一个元素。

例如,如果你想写一个转换程序来除去这个注释,但是保留文档中任何其他地方出现的注释,你可以将以下内容添加到标识转换程序中:

<xsl:template match="/comment()"/>

这里有一个更简单(且更常用)的 XPath 模式,可以匹配文档的顶级元素而不管它的名称:/*


4
今天早上我花了很长一段时间完全被这个文档/根元素二分法弄糊涂了。我使用XML和DOM已经有好几年了,但仍然会在这类问题上跌倒! - Tom Anderson
1
谢谢你让我了解这个微妙但基本的区别,我太长时间以来都没有意识到它! :) - Chris
哇,我已经使用XSLT工作了7年,但是我不知道这个。 - Joshua Hedges

11

match属性指定模板转换应用的部分。在这种情况下,“/”表示xml文档的根。您必须提供到match属性中的值应该是XPath表达式。XPath是您用于引用目标xml文件的特定部分的语言。

为了深入了解可以将什么放入match属性以及如何使用它,您需要了解XPath是什么以及如何使用它。我建议您查看我在回答末尾提供的链接。

我能写入 table 或其他任何 html 标签来代替 “/” 吗?

可以,但这取决于您想要完成的具体任务。如果您的目标xml文件包含HTML元素,并且您正在尝试对它们应用此 xsl:template,那么使用 tablediv 或其他任何标签都是有意义的。

以下是一些链接:


3
这个答案实际上不正确。并非每个XPath表达式都可以指定为合法的匹配模式。 - Dimitre Novatchev
2
我同意,但在我看来,对于初学者来说,最好将匹配模式视为使用XPath定义的方式。 - Koynov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接