【问题标题】:XSLT to copy value in a node to another across repeating nodesXSLT 跨重复节点将节点中的值复制到另一个节点
【发布时间】:2015-06-20 08:52:39
【问题描述】:

对 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>

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    所有此类任务都使用模板

    <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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多