我们所说的xsl符号 <xsl:template match="/|@*|node()"> 是什么意思?

14

我不明白下面这句话的意思:

<xsl:template match="/|@*|node()">
<xsl:apply-templates match="@*|node()"/>
</xsl:template>

请帮助我..

<xsl:template match="local-name()='status'"/> 
<xsl:template match="/|@*|node()"> 
<xsl:copy> 
<xsl:apply-templates match="@*|node()"/> 
<xsl:copy> 
</xsl:template>

如果我这样应用,它会忽略我的XML中的<status>节点,这是怎么发生的?

1个回答

20

/|@*|node() 是由三个单一模式组成的匹配模式,与匹配模式相关。 / 匹配根节点,也称为文档节点,@* 匹配任何属性节点,而 node() 作为一个模式 "匹配除属性节点和根节点之外的任何节点"。因此对于任何类型的节点(因为这三个模式描述了所有类型的节点),模板指示 <xsl:apply-templates select="@*|node()"/> 表示处理属性节点和子节点的联合。由 / 匹配的文档节点没有属性节点,属性也没有它们,但通常可以看到这种紧凑的方式的模板。

然而,文档节点有一个内置模板,其中执行 <xsl:template match="/"><xsl:apply-templates/></xsl:template>,因此通常人们省略了模式中的 /


此外,在 xsl:apply-templates 中的 match 应该改为 select - Daniel Haley
<xsl:template match="local-name()='status'"/> <xsl:template match="/|@*|node()"> xsl:copy <xsl:apply-templates match="@*|node()"/> xsl:copy </xsl:template>如果我这样应用,它会省略我的xml中的<status>节点,这是怎么发生的? - Ironman
DevNull,感谢您指出apply-templates片段中的错误,我已经进行了更正。 - Martin Honnen
Srivatsava Sesham,如果您在处理特定的输入文档和XSLT时遇到问题,请考虑发起一个新的问题,并清楚地展示所有相关的代码(包括XML输入、您拥有的XSLT、您期望的输出以及当前获得的输出)。 - Martin Honnen

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