2

我目前坚持为一个元素应用多个具有相同匹配的 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>
4

2 回答 2

14

根据 XSLT 规范,有两个相同优先级的模板匹配同一个节点是错误的,并且:

如果[处理器]没有发出错误信号,它必须通过从剩下的匹配模板规则中选择样式表中最后出现的规则来恢复。(来源

这就是第二个模板获胜的原因。

如果您想将数字格式分解为可重用的组件,我会考虑使用命名模板

<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>
于 2013-08-29T14:51:10.927 回答
0

通常您会使用“模式”来处理具有不同模板的同一节点。我认为你不需要在你的情况下。如果应用此 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>
于 2013-08-29T14:39:51.257 回答