使用部分数据进行xslt克隆

时间:2014-08-21 16:16:00

标签: xml git xslt clone

我想用一些核心节点的数据克隆一个节点。剩下的值和其他一些数据应放入另一个克隆中。这是一个例子中最简单的描述。

要操作的Xml代码示例:

<root>
    <element>
        <number>13245</number>
        <info>
            <desc>
                <value locale="en">some text in en</value>
                <value locale="es">some text in es</value>
            </desc>
            <calc>
                <value locale="en">some more text in en</value>
                <value locale="es">some more text in es</value>
            </calc>
            <date>2014-08-21</date>
        </info>
    </element>
</root>

现在我想要实现的目标(并且始终失败)是一个输出,如:

<root>
    <element>
        <number>13245</number>
        <info>
            <desc>
                <value locale="es">some text in es</value>
            </desc>
            <calc>
                <value locale="es">some more text in es</value>
            </calc>
            <date>2014-08-21</date>
        </info>
    </element>
    <element>
        <number>13245</number>
        <info>
            <desc>
                <value locale="en">some text in en</value>
            </desc>
            <calc>
                <value locale="en">some more text in en</value>
            </calc>
            <date>2014-08-21</date>
        </info>
    </element>
</root>

转换应该在根中创建两个元素,其中包含一些核心值,如日期和数字,但每个元素只包含一个区域设置的值。

我不希望任何人为我编码,但一些指针会有很长的路要走。谢谢!

1 个答案:

答案 0 :(得分:2)

这是达到要求输出的一种方式 - 不一定是最好的或最有效的方式:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform with tunneling parameter-->
<xsl:template match="@*|node()">
    <xsl:param name="locale"/>
    <xsl:copy>
        <xsl:apply-templates select="@*|node()">
            <xsl:with-param name="locale" select="$locale"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

<xsl:template match="element">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()">
            <xsl:with-param name="locale" select="'es'"/>
        </xsl:apply-templates>
    </xsl:copy>
    <xsl:copy>
        <xsl:apply-templates select="@*|node()">
            <xsl:with-param name="locale" select="'en'"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

<xsl:template match="value[@locale]">
    <xsl:param name="locale"/>
    <xsl:if test="@locale=$locale">
        <xsl:copy-of select="."/>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>