使用 XSLT 2.0 重构 XML 层次结构

问题描述 投票:0回答:1

有一个 XML 文件,其结构为 Transaction/isaPartners/Partner/Header/Item,isaPartner 下有多个合作伙伴。

<?xml version="1.0" encoding="UTF-8"?>
<Transactions>
    <isaPartners>
        <Partner partnerId="PartnerA">
            <Header currencyCode="USD" dateCreated="10/17/23" invoiceNumber="12345">
                <Item uom="EA" price="1.20" item="99987" />
            </Header>
        </Partner>
        <Partner partnerId="PartnerB">
            <Header currencyCode="USD" dateCreated="10/17/23" invoiceNumber="98765">
                <Item uom="EA" price="5.60" item="7765" />
            </Header>
        </Partner>
        <Partner partnerId="PartnerC" >
            <Header currencyCode="USD" dateCreated="10/17/23" invoiceNumber="45678">
                <Item uom="EA" price="6.50" item="1123" />
            </Header>
        </Partner>
    </isaPartners>
</Transactions>

我正在尝试获取所有标题/项目实例并将其放在一个 Partner/@partnerId 下,我可以随意命名。

输出应该是: 在这种情况下,我将获取一个 Partner/@partnerID = PartnerD 下的所有标题/项目

<?xml version="1.0" encoding="UTF-8"?>
<Transactions>
    <isaPartners>
        <Partner partnerId="PartnerD">
            <Header currencyCode="USD" dateCreated="10/17/23" invoiceNumber="12345">
                <Item uom="EA" price="1.20" item="99987" />
            </Header>
            <Header currencyCode="USD" dateCreated="10/17/23" invoiceNumber="98765">
                <Item uom="EA" price="5.60" item="7765" />
            </Header>
            <Header currencyCode="USD" dateCreated="10/17/23" invoiceNumber="45678">
                <Item uom="EA" price="6.50" item="1123" />
            </Header>
        </Partner>
    </isaPartners>
</Transactions>

我不知道从哪里开始,所以我没有我尝试过的例子。我熟悉如何在 XML 结构中操作 XML 元素,但不知道如何以这种方式对结构进行重新排序。预先感谢您的帮助!!

xml xslt-2.0
1个回答
0
投票

这是 xslt 中的一个非常基本的任务,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  
  <!-- Matches and copies all -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  
  <!-- Matches and copies isaPartners and creates a new Partner and applies in that new Partner all Partner/Header -->
  <xsl:template match="isaPartners">
    <xsl:copy>
      <Partner partnerId="PartnerD">
        <xsl:apply-templates select="Partner/Header"/>
      </Partner>
    </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.