使用 XSLT 2.0 的 Restucture XML 层次结构

Restucture XML Hierarchy with XSLT 2.0

提问人:Eric Smith 提问时间:10/30/2023 更新时间:10/30/2023 访问量:29

问:

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

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

我正在尝试获取所有 Header/Item 实例,并将其放在一个我可以命名的 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

评论


答:

2赞 Siebe Jongebloed 10/30/2023 #1

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

评论

0赞 Eric Smith 10/30/2023
嗨,Siebe:这效果很好!我很惊讶这是一个如此简单的修复。我需要更好地了解模板和元素是如何操作的,尤其是使用复制标签。