XSLT:如何在"匹配"属性中表示OR?

tom*_*ato 27 xml xslt

我想对匹配名称"A"或"B"的元素执行一系列操作.我正在考虑下面这样的事情,但它不起作用.

<xsl:template match= " 'A' or 'B'" >
     <!-- whatever I want to do here -->
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

无法找到适当的XSLT语言参考.请帮忙!谢谢!!

Rob*_*ney 27

一般来说,这A | B是正确的方法.但是管道字符基本上是两个完整的XPath表达式的联合.在这样的情况下使用它可能很烦人:

/red/yellow/blue/green/gold | red/orange/blue/green/gold
Run Code Online (Sandbox Code Playgroud)

因为你正在重复整个表达式,除了它的一小段内容正在发生变化.

在这种情况下,使用谓词和name()函数通常是有意义的:

/red/*[name() = 'yellow' or name()='orange']/blue/green/gold
Run Code Online (Sandbox Code Playgroud)

此技术使您可以访问更广泛的逻辑操作.它(也可以)更快,因为XPath导航器只需要遍历它测试一次的节点.


小智 12

我认为使用这个XPath更方便

/red/(yellow | orange)/blue/green/gold
Run Code Online (Sandbox Code Playgroud)

而不是

/red/*[name() = 'yellow' or name()='orange']/blue/green/gold
Run Code Online (Sandbox Code Playgroud)

  • 这在`template` 的`match` 属性中不起作用。它是有效的 XPATH 但不是有效的模式。 (2认同)

Dim*_*hev 6

<xsl:template match= " 'A' or 'B'" >

这种匹配模式存在一些问题:

  1. 模板匹配节点,而不是字符串.因此,不应将要匹配的元素的名称指定为带引号的字符串.

  2. XPath的运算符"或"两个布尔值的行为,而不是节点.这里需要的是另一个XPath运算符 - union运算符"|" .

考虑到上述情况,可以正确地将模板规则指定为:

<xsl:template match= "A | B" >
     <!-- whatever I want to do here -->
</xsl:template>
Run Code Online (Sandbox Code Playgroud)