Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 为什么';XSL是否与此语句匹配?_Xslt_Xpath_Predicate - Fatal编程技术网

Xslt 为什么';XSL是否与此语句匹配?

Xslt 为什么';XSL是否与此语句匹配?,xslt,xpath,predicate,Xslt,Xpath,Predicate,我有一个与之匹配的属性。它将匹配两个XSL模板,但其中一个模板比另一个模板更具体。但是,除非我在样式表中将“simpler”(谓词不太具体)一个放在另一个之上,否则它将匹配更简单的一个。从和其他问题中,我可以看到,如果它匹配两个模板,它将使用最具体的模板,然后如果它们相同,它将匹配样式表中的最后一个模板 模板1: <xsl:template match="@audit[contains($tier,'tier_3')][((starts-with(.,'approve') and cont

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

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


有什么想法吗?

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

节点测试本身的复杂性并不是为了解决问题而分析的。这一切在你链接的文档中都非常明确——你真的读过吗


如果您想要一个特定的顺序,可以对模板进行排序,或者使用模板规则中的优先级属性。

写了一半,但您的内容涵盖了它。该文档显示了所有类型的实际优先级值。据我所知,谓词的额外特殊性影响了它的选择,但我现在看到了逻辑。谢谢。可能是第二份