XSLT将节点中的值复制到重复节点

时间:2015-06-20 08:52:39

标签: xml xslt

XSLT非常新,需要一些帮助才能转换XML。以下XML可以有多个“行”标记

    <?xml version="1.0" encoding="UTF-8"?>
    <ns1:row>
        <ns1:City>BALTIMORE</ns1:City>
        <ns1:Miscdata>
            <ns1:Building>
                <ns1:VendorCode>123</ns1:VendorCode>
                <ns1:Value>2</ns1:Value>
            </ns1:Building>
            <ns1:Building>
                <ns1:VendorCode>345</ns1:VendorCode>
                <ns1:Value>8</ns1:Value>
            </ns1:Building>
        </ns1:Miscdata>
</ns1:row>

    <ns1:row>
            <ns1:City>FREMONT</ns1:City>
            <ns1:Miscdata>
                <ns1:Building>
                    <ns1:VendorCode>332</ns1:VendorCode>
                    <ns1:Value>4</ns1:Value>
                </ns1:Building>
                <ns1:Building>
                    <ns1:VendorCode>342</ns1:VendorCode>
                    <ns1:Value>14</ns1:Value>
                </ns1:Building>
                <ns1:Building>
                    <ns1:VendorCode>323</ns1:VendorCode>
                    <ns1:Value>233</ns1:Value>
                </ns1:Building>
            </ns1:Miscdata>
    </ns1:row>

上述XML中“VendorCode”标记中的值需要复制到“Value”标记。输出XML将是

<?xml version="1.0" encoding="UTF-8"?>
<ns1:row>
        <ns1:City>BALTIMORE</ns1:City>
        <ns1:Miscdata>
            <ns1:Building>
                <ns1:VendorCode>123</ns1:VendorCode>
                <ns1:Value>123</ns1:Value>
            </ns1:Building>
            <ns1:Building>
                <ns1:VendorCode>345</ns1:VendorCode>
                <ns1:Value>345</ns1:Value>
            </ns1:Building>
        </ns1:Miscdata>
</ns1:row>
<ns1:row>
        <ns1:City>FREMONT</ns1:City>
        <ns1:Miscdata>
            <ns1:Building>
                <ns1:VendorCode>332</ns1:VendorCode>
                <ns1:Value>332</ns1:Value>
            </ns1:Building>
            <ns1:Building>
                <ns1:VendorCode>342</ns1:VendorCode>
                <ns1:Value>342</ns1:Value>
            </ns1:Building>
            <ns1:Building>
                <ns1:VendorCode>323</ns1:VendorCode>
                <ns1:Value>323</ns1:Value>
            </ns1:Building>
        </ns1:Miscdata>
</ns1:row>

1 个答案:

答案 0 :(得分:0)

所有此类任务都使用模板

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

作为起点,然后为需要特殊处理的节点添加模板,例如在你的情况下

<xsl:template match="ns1:Building/ns1:Value">
  <xsl:copy>
    <xsl:value-of select="preceding-sibling::ns1:VendorCode"/>
  </xsl:copy>
</xsl:template>