我目前坚持应用多个 xsl:template 来对元素进行相同的匹配。下面的例子显示了这个问题。
有谁知道使用两个“模板匹配”创建预期输出的 XSL 模板吗?由于技术原因,不可能将两个“模板”元素放在一起。
Input
<root>
<elem>123.45</elem>
<elem>789.12</elem>
</root>
XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:decimal-format name="de" decimal-separator="," grouping-separator="."/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/root/elem">
<xsl:element name="renamed">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="/root/elem">
<xsl:element name="elem">
<xsl:value-of select="format-number(.,'#.##0,0000','de')" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Output:
<root>
<elem>123,4500</elem>
<elem>789,1200</elem>
</root>
预期输出:
<root>
<renamed>123,4500</renamed>
<renamed>789,1200</renamed>
</root>
根据 XSLT 规范,拥有两个相同优先级的模板匹配同一节点是错误的,并且:
如果[处理器]没有发出错误信号,它必须通过从剩下的匹配模板规则中选择样式表中最后出现的规则来恢复。 (source http://www.w3.org/TR/xslt#conflict)
这就是第二个模板获胜的原因。
如果您想将数字格式分解为可重复使用的组件,我会考虑命名模板
<xsl:template name="format">
<xsl:value-of select="format-number(.,'#.##0,0000','de')" />
</xsl:template>
<xsl:template match="/root/elem">
<renamed>
<xsl:call-template name="format" />
</renamed>
</xsl:template>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)