XSL xsl:template match ="/"

Pat*_*Pat 53 xml xslt xslt-2.0 xslt-1.0

我只是在学习XML以及如何使用XSL文件.在XSL文件中,我发现了以下术语:

xsl:template match="/"
Run Code Online (Sandbox Code Playgroud)

这代表什么?我可以用什么而不是/?我可以写table或任何其他HTML标签而不是/

Dim*_*hev 121

指令match属性的值<xsl:template>必须是匹配模式.

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

/在XPath中表示根节点或文档节点.在XPath 2.0(以及XSLT 2.x)中,这也可以写成document-node().

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

匹配模式的示例:

<xsl:template match="table">
Run Code Online (Sandbox Code Playgroud)

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

<xsl:template match="x/y">
Run Code Online (Sandbox Code Playgroud)

可以应用于任何名为y父元素的元素x.

<xsl:template match="*">
Run Code Online (Sandbox Code Playgroud)

可以应用于任何元素.

<xsl:template match="/*">
Run Code Online (Sandbox Code Playgroud)

只能应用于XML文档的顶部元素.

<xsl:template match="@*">
Run Code Online (Sandbox Code Playgroud)

可以应用于任何属性.

<xsl:template match="text()">
Run Code Online (Sandbox Code Playgroud)

可以应用于任何文本节点.

<xsl:template match="comment()">
Run Code Online (Sandbox Code Playgroud)

可以应用于任何注释节点.

<xsl:template match="processing-instruction()">
Run Code Online (Sandbox Code Playgroud)

可以应用于任何处理指令节点.

<xsl:template match="node()">
Run Code Online (Sandbox Code Playgroud)

可以应用于任何节点:元素,文本,注释或处理指令.


Rob*_*ney 40

值得注意的是,因为对XML新手来说很困惑,XML文档的根(或文档节点)不是顶级元素.它是顶级元素的父级.这很令人困惑,因为顶层元素似乎不具有父级.不是顶级吗?

但是看看这个格式良好的XML文档:

<?xml-stylesheet href="my_transform.xsl" type="text/xsl"?>
<!-- Comments and processing instructions are XML nodes too, remember. -->
<TopLevelElement/>
Run Code Online (Sandbox Code Playgroud)

该文档的根有三个子节点:处理指令,注释和元素.

因此,例如,如果您想编写一个删除该注释的转换,但留在文档中任何其他位置出现的任何注释中,您可以将其添加到标识转换中:

<xsl:template match="/comment()"/>
Run Code Online (Sandbox Code Playgroud)

更简单(也更常用),这里的XPath模式与文档的顶级元素相匹配,无论其名称如何: /*.

  • 我今天早上花了很多时间对这个文件/根元素二分法感到困惑.我多年来一直在使用XML和DOM,但仍然在这样的事情上绊倒! (4认同)

Koy*_*nov 8

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

要获得有意义的理解,您可以将其放入match属性中,您需要了解xpath是什么以及如何使用它.我建议你看看我在答案底部为你提供的链接.

我可以写"table"或任何其他html标签而不是"/"吗?

是的你可以.但这取决于你究竟想要做什么.如果您的目标xml文件包含HMTL元素,并且您要对它们应用此xsl:template,则使用table,div或anithing else是有意义的.

这里有几个链接:

  • 这个答案实际上并不正确.并非每个XPath表达式都可以指定为合法匹配模式. (2认同)
  • 我同意,但在我看来,初学者考虑匹配模式更好,因为它是使用XPath定义的. (2认同)