我目前停留在应用多个xsl:template,并且元素的匹配方式相同。以下示例显示了问题。
有没有人知道使用两个“模板匹配”创建预期输出的XSL模板?由于技术原因,不可能将两个“模板”元素放在一起。
输入
<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>
输出:
<root>
<elem>123,4500</elem>
<elem>789,1200</elem>
</root>
预期产出:
<root>
<renamed>123,4500</renamed>
<renamed>789,1200</renamed>
</root>
由于
答案 0 :(得分:9)
根据XSLT规范,具有相同优先级的两个模板匹配同一节点是错误,并且:
如果[处理器]没有发出错误信号,它必须通过从剩下的匹配模板规则中选择样式表中最后出现的那个来恢复。 (source)
这就是第二个模板获胜的原因。
如果您想将数字格式分解为可重复使用的组件,我会考虑使用命名模板
<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>
答案 1 :(得分:0)
通常,您将使用“mode”来处理具有不同模板的同一节点。我觉得你不需要在你的情况下。如果你应用这个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="/">
<root>
<xsl:apply-templates />
</root>
</xsl:template>
<xsl:template match="/root/elem">
<xsl:element name="renamed">
<xsl:value-of select="format-number(.,'#.##0,0000','de')" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
到您的源XML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<elem>123.45</elem>
<elem>789.12</elem>
</root>
你得到这个输出:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<renamed>123,4500</renamed>
<renamed>789,1200</renamed>
</root>
祝你好运, 彼得