XSLT通过更改值来复制XML

时间:2015-02-18 07:38:16

标签: xml xslt

我们有一个需要使用XSLT转换的xml。但是,我们必须添加标记的两个属性并将其放在其他标记中。

在下面的XML编译标记中,“Reusable”列的值为contrib和max_available。我们想要添加这两个属性,并希望它在编译标签的属性postPosition中使用“Usable”列。现在,我们还需要在fac值的基础上添加。

输入

<?xml version="1.0" encoding="UTF-8"?>
<answers user="LST">
    <answer name="compile">
        <output>
            <compilations>
                <compilation column="Usable" fac="123" contrib="0" max_available="0" postPosition="35000">
                </compilation>
                  <compilation column="Usable" fac="456" contrib="0" max_available="0" postPosition="35000">
                </compilation>
                  <compilation column="ReUsable" fac="123" contrib="0" max_available="200" postPosition="300">
                </compilation>
                <compilation column="Reusable" fac="456" contrib="100.00" postPosition="100.00" max_available="200">
                </compilation>
            </compilations>
        </output>
    </answer>
</answers>

输出

<?xml version="1.0" encoding="UTF-8"?>
    <answers>
        <answer name="compile">
            <output>
                <compilations>
                    <compilation column="Usable" fac="123" contrib="0" max_available="0" postPosition="500">
                    </compilation>
                      <compilation column="Usable" fac="456" contrib="0" max_available="0" postPosition="300">
                    </compilation>
                      <compilation column="ReUsable" fac="123" contrib="0" max_available="200" postPosition="300">
                    </compilation>
                    <compilation column="Reusable" fac="456" contrib="100.00" postPosition="100.00" max_available="200">
                    </compilation>
                </compilations>
            </output>
        </answer>
    </answers>

2 个答案:

答案 0 :(得分:1)

简单地说:

XSLT 2.0

<xsl:stylesheet version="2.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 -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="compilation[@column='Usable']/@postPosition">
    <xsl:attribute name="postPosition" select="format-number(../../compilation[@column='Reusable']/(@contrib + @max_available), '0.00')" />
</xsl:template>

</xsl:stylesheet>

请注意,这假设在compilation元素中只有一个column具有“可重复使用”compilations


编辑:

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 -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="compilation[@column='Usable']/@postPosition">
<xsl:variable name="reusable" select="../../compilation[@column='Reusable']" />
    <xsl:attribute name="postPosition"> 
        <xsl:value-of select="format-number($reusable/@contrib + $reusable/@max_available, '0.00')" />
    </xsl:attribute>  
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

以下XSLT将复制Usable编译并更改postPosition属性的值:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:template match="compilation[@column='Usable']">
        <xsl:copy>
            <!-- copy other attributes first -->
            <xsl:apply-templates select="@column"/>
            <xsl:apply-templates select="@contrib"/>
            <xsl:apply-templates select="@max_available"/>
            <!-- set the postPosition attribute -->
            <xsl:attribute name="postPosition">
                <xsl:variable name="reusableCompilation" select="../compilation[@column='Reusable']"/>
                <xsl:value-of select="number($reusableCompilation/@contrib)+number($reusableCompilation/@max_available)"></xsl:value-of>
            </xsl:attribute>
            <!-- copy all child elements -->
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- generic template - copy all the rest -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

这将为您提供以下输出,其中包含@contrib + @max_available:

两个属性的总和
<?xml version="1.0" encoding="UTF-8"?>
<answers>
    <answer name="compile">
        <output>
            <compilations>
                <compilation column="Usable" contrib="0" max_available="0" postPosition="300">
                </compilation>
                <compilation column="Reusable" contrib="100.00" postPosition="100.00" max_available="200">
                </compilation>
            </compilations>
        </output>
    </answer>
</answers>