XSLT模板&x27;歧义澄清
运行以下输入XML时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
<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