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

时间:2009-03-05 20:10:59

标签: xml xslt

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

<xsl:template match= " 'A' or 'B'" >
     <!-- whatever I want to do here -->
</xsl:template>

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

5 个答案:

答案 0 :(得分:38)

试试这个:

<xsl:template match= "A | B" >

See this page for details.

答案 1 :(得分:26)

通常A | B是执行此操作的正确方法。但是管道字符基本上是两个完整的XPath表达式的联合。在这样的情况下使用它可能很烦人:

/red/yellow/blue/green/gold | red/orange/blue/green/gold

因为你正在重复整个表达式,除了它的一小段变化。

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

/red/*[name() = 'yellow' or name()='orange']/blue/green/gold

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

答案 2 :(得分:12)

我认为使用这个XPath更方便

/red/(yellow | orange)/blue/green/gold

而不是

/red/*[name() = 'yellow' or name()='orange']/blue/green/gold

答案 3 :(得分:6)

  

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

此匹配模式存在一些问题

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

  2. XPath operator "or" 对两个布尔值起作用,而不是在节点上。这里需要的是another XPath operator -- the union operator "|"

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

    <xsl:template match= "A | B" >
         <!-- whatever I want to do here -->
    </xsl:template>
    

答案 4 :(得分:1)

以下信息来自:http://www.cafeconleche.org/books/bible2/chapters/ch17.html#d1e2090

我会解释,请搜索“使用或运算符|”文本在那份文件中。

语法为:

<xsl:template match="A|B">
   <!-- Do your stuff> -->
</xsl:template>