Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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模板&x27;歧义澄清_Xslt_Xpath_Xslt 1.0_Xslt 2.0 - Fatal编程技术网

XSLT模板&x27;歧义澄清

XSLT模板&x27;歧义澄清,xslt,xpath,xslt-1.0,xslt-2.0,Xslt,Xpath,Xslt 1.0,Xslt 2.0,运行以下输入XML时 <root> <value>false</value> <value>true</value> </root> 但只有当我将模板匹配更改为root/value时,我才会得到模棱两可的模板警告 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:o

运行以下输入XML时

<root>
    <value>false</value>
    <value>true</value>
</root>
但只有当我将模板匹配更改为
root/value
时,我才会得到模棱两可的模板警告

<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="root/value">
    <true_value/>
</xsl:template>

<xsl:template match="root/value[. = 'false']">
    <false_value/>
</xsl:template>

</xsl:stylesheet>


请帮我解释一下,在
xsl:template
@match
中向xpath添加
root
有什么区别,使我得到这个警告。(
不明确的规则匹配/root[1]/value[1]

您的结果是由于隐式模板优先级造成的。您可以在任何模板上明确指定优先级:

<xsl:template match="foo" priority="2"/>
<xsl:template match="root/value[. = 'false']">
结果将是(在线查看):

不会更改任何内容,默认优先级保持为0.5


看。警告:默认优先级并不容易阅读


所有优先事项:

<xsl:template match="value">                        0
<xsl:template match="value[. = 'false']">         0.5
<xsl:template match="root/value">                 0.5
<xsl:template match="root/value[. = 'false']">    0.5
0
0.5
0.5
0.5

通常,默认优先级表示模板规则中匹配模式的特殊性。匹配模式“value”不如“root/value”具体,后者仅将value元素与根父元素匹配,因此root/value具有更高的默认优先级

默认优先级(0.5)恰好与以谓词为特征的匹配模式的优先级相同(请注意,根/值也可以写成值[parent::root]),这导致了模板冲突

您的第一个模板模式(例如,标识模板)也容易发生模板冲突,该模板将与匹配*的模板冲突。请注意,当发现此类冲突时,允许XSLT处理器失败,而不是尝试根据各自模板的位置进行选择


如果从其样式表中导入标识转换,则会消除不必要的重复并减少冲突,因为导入样式表中的模板优先级低于导入样式表中的模板。

@MartinHonnen感谢Martin,我也试图解决这个问题——如果你有任何其他建议,请告诉我。很高兴收到你的来信。谢谢你这么详细的解释。
<xsl:template match="root/value">
<xsl:template match="root/value[. = 'false']">
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="root/value[. = 'false']">
    <false_value/>
</xsl:template>

<xsl:template match="root/value">
    <true_value/>
</xsl:template>

</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<root>
   <true_value/>
   <true_value/>
</root>
<xsl:template match="value">
<xsl:template match="root/value">
<xsl:template match="root/value[. = 'false']">
<xsl:template match="value">                        0
<xsl:template match="value[. = 'false']">         0.5
<xsl:template match="root/value">                 0.5
<xsl:template match="root/value[. = 'false']">    0.5