为什么XSL不匹配此声明?

时间:2012-07-16 10:03:21

标签: xslt xpath predicate

我有一个与之匹配的属性。它将匹配2个XSL模板,但其中一个比另一个更具体。但是,除非我在样式表中将'simpler'(谓词不太具体)一个放在另一个之上,否则它将与更简单的一个匹配。从http://www.w3.org/TR/xslt/#conflict和其他问题我可以看到,如果它匹配2个模板,它将使用最具体的,然后如果它们是相同的,它将匹配样式表中的最后一个。

模板1:

<xsl:template match="@audit[contains($tier,'tier_3')][((starts-with(.,'approve') and contains(.,'CM')) or (contains(.,'ReviewRequested') and not(contains(.,'CM') or contains(.,'BM') or contains(.,'ME'))))]" mode="action">

模板2:

<xsl:template match="@audit[contains($tier,'tier_3')]" mode="action">

我不知道这是什么规则导致这种情况发生?

通过更改为:

,我将匹配更改为1组方括号而不是2
    <xsl:template match="@audit[contains($tier,'tier_3') and ((starts-with(.,'approve') and contains(.,'CM')) or (contains(.,'ReviewRequested') and not(contains(.,'CM') or contains(.,'BM') or contains(.,'ME'))))]" mode="action">

但结果相同。

我知道它匹配两者,因为如果我注释掉简单的那个,它就会与模板1匹配。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

它们都具有相同的特定性,因为它们都具有相同的路径@audit并且它们都具有节点测试。

为了解决问题,不分析节点测试本身的复杂性。这一切都在您链接的文档中非常明确 - 您是否实际阅读过它?

如果您需要特定订单,请订购模板或使用模板规则中的优先级属性。