Templates 如何在XSLT模板匹配的XPATH中添加或设置条件

Templates 如何在XSLT模板匹配的XPATH中添加或设置条件,templates,xslt,match,Templates,Xslt,Match,我需要为XSLT的两个节点的字段选择两个值 我需要通过选择CAT和DOG来选择节点A1和A2 输入看起来像这样 <MAIN> <A1> <B1>CAT</B1> <B2>KITTEN</B2> </A1> <A2> <B1>DOG</B1> <B2>PUPPY</B2>

我需要为XSLT的两个节点的字段选择两个值

我需要通过选择CAT和DOG来选择节点A1和A2

输入看起来像这样

<MAIN>
    <A1>
        <B1>CAT</B1>
        <B2>KITTEN</B2>
    </A1>
    <A2>
        <B1>DOG</B1>
        <B2>PUPPY</B2>
    </A2>
    <A3>
        <B1>LION</B1>
        <B2>CUB</B2>
    </A3>
</MAIN>

猫
小猫
狗
小狗
狮子
幼兽
我使用下面的表达:

    <xsl:template match="MAIN[(A1/B1='CAT') or (A2/B1='DOG')]">
    </xsl:template>

这在运行时导致XPATH表达式错误

也在下面使用,未拾取值

   <xsl:template match="MAIN[A1/B1='CAT' or A2/B1='DOG']">
   </xsl:template>


XPath中的
运算符写为|(垂直条)

若要引用包含某些文本值的元素,应使用 谓词,类似于
[text()='…']

因此,您的模板可以写成:

<xsl:template match="A1/B1[text() = 'CAT'] | A2/B1[text() = 'DOG']"/>

请注意,对于空模板,您不必编写 任何单独的结束标记。写
正如我在上面所做的

补充说明 你可以写一个点来代替
text()

XPath表达式
A1[B1='CAT']
也正确,但其含义是 与上面不同。它是指:

  • 整个
    A1
    元素
  • 其子元素
    B1
    的内容为CAT

您能否发布一个导致错误的最小但完整的示例,以及关于哪个工具或XSLT处理器准确地为哪一行给出错误的信息?我没有发现任何错误,并且在您的模板上没有给出任何错误消息。不要告诉我们出现错误的内容,而不告诉我们错误是什么。您可能不理解错误消息,但我们很可能会识别它。这个答案不能解释失败。“or”运算符在XPath 1.0和XPath 2.0中都有定义,并且在所示的示例代码中使用正确。此外,给出的替换代码具有完全不同的效果:它匹配B1元素而不是主元素。在空模板中匹配主元素没有什么意义。实际上,在匹配的情况下,输出内容将为空。这就是为什么我认为真正的目的是“抑制”输出中的匹配元素。另一方面,我应该在回答中提到这一点。