我有一个与之匹配的属性。它将匹配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匹配。
有什么想法吗?
答案 0 :(得分:2)
它们都具有相同的特定性,因为它们都具有相同的路径@audit
并且它们都具有节点测试。
为了解决问题,不分析节点测试本身的复杂性。这一切都在您链接的文档中非常明确 - 您是否实际阅读过它?
如果您需要特定订单,请订购模板或使用模板规则中的优先级属性。