0

我有一个匹配的属性。它将匹配 2 个 XSL 模板,但一个比另一个更具体。但是,除非我在样式表中将“更简单”(谓词不太具体)放在另一个之上,否则它将匹配更简单的那个。从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">

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

我通过更改为:

    <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 匹配。

有任何想法吗?

4

1 回答 1

2

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

节点测试本身的复杂性并未出于解决的目的进行分析。在您链接的文档中,这一切都非常明确-您真的阅读了吗?

如果您需要特定顺序,请对模板进行排序或使用模板规则上的优先级属性。

于 2012-07-16T10:12:21.193 回答