是否可以将XSLT模板添加到两个不同的节点?

时间:2016-12-27 07:12:48

标签: xml xslt

下面是我格式化日期的模板。

<xsl:template match="data/header/ORDER_DATE">
    <xsl:copy>
        <xsl:value-of select="substring(., 7, 2)" />
        <xsl:text> </xsl:text>
        <xsl:variable name="month" select="substring(., 5, 2)" />
        <xsl:value-of select="substring('JanFebMarAprMayJunJulAugSepOctNovDec', 3 * ($month - 1) + 1, 3)"/>
        <xsl:text> </xsl:text>
        <xsl:value-of select="substring(., 1, 4)" />
    </xsl:copy>
</xsl:template>

以下是将模板应用于标题的代码。

<xsl:apply-templates select="ORDER_DATE" />

以下是相应xml的代码

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <header>
        <ORDER_DATE>20161209</ORDER_DATE>
    </header>
    <order_item>
       <ITEM_DATE>20161211000000</ITEM_DATE>
    </order_item>
    <order_item>
        <ITEM_DATE>20161212000000</ITEM_DATE>
    </order_item>
</data>

但是,有两个不同的节点,我需要应用相同的模板。有没有办法让这个模板成为一个通用函数,以便我可以在任何地方应用它并具有可重用性?

1 个答案:

答案 0 :(得分:1)

使用

<xsl:template match="ORDER_DATE|ITEM_DATE">
...

或者,如果您想要更一般,请尝试使用命名模板

<xsl:template match="data/*/*[contains(local-name(),'DATE')]">
  <xsl:call-template name="date" />
</xsl:template>

<xsl:template name="date">
    <xsl:copy>
        <xsl:value-of select="substring(., 7, 2)" />
        <xsl:text> </xsl:text>
        <xsl:variable name="month" select="substring(., 5, 2)" />
        <xsl:value-of select="substring('JanFebMarAprMayJunJulAugSepOctNovDec', 3 * ($month - 1) + 1, 3)"/>
        <xsl:text> </xsl:text>
        <xsl:value-of select="substring(., 1, 4)" />
    </xsl:copy>
</xsl:template>