2012-07-16 52 views
0

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

模板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

[XSL模板优先顺序]的可能重复(http://stackoverflow.com/questions/5709581/xsl-template-precedence) – Ben 2012-07-16 10:15:22

回答

2

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

节点测试本身的复杂性没有为解析的目的进行分析。在你链接的文件中,这一切都非常明确 - 你是否真的读过它?

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

+0

通过编写相同的东西,但你的覆盖它的一半。该文档显示了所有类型的实际优先值 – Woody 2012-07-16 10:15:05

+0

据我所知,谓词的额外特性影响了它的选择,但我现在看到逻辑了。谢谢。 – 2012-07-16 10:39:32