使用XSLT 1.0组合XML



我需要映射下面的内容,但这很困难,因为它有不同的名称:

<main>
    <order>
        <ID>123</ID>
        <Name>ABC</Name>
    </order>
    <order>
        <ID>4556</ID>
        <Name>AAA</Name>
        <ParentID>123</ParentID>
    </order>
</main>

结果应该是:

<main>
    <order>
        <ID>123</ID>
        <Name>ABC</Name>
        <order>
            <ID>4556</ID>
            <Name>AAA</Name>
            <ParentID>123</ParentID>
        </order>
    </order>
</main>

像@michael。Hor257k说,这个问题在概念上和你之前的问题是一样的。我觉得你只是没有理解这个概念。希望我的例子中的注释会有所帮助。

如果我正确理解了这个问题,您希望基于ParentIDorder元素嵌套到它们的"父"order元素中。因为我们基于ParentID,所以我们将使用它作为我们的键…

XML输入

<main>
    <order>
        <ID>123</ID>
        <Name>ABC</Name>
    </order>
    <order>
        <ID>4556</ID>
        <Name>AAA</Name>
        <ParentID>123</ParentID>
    </order>
</main>
XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>
  <!--Create a key containing order elements that contain a non-empty ParentID.-->
  <xsl:key name="orderByParentId" match="order[string(ParentID)]" use="ParentID"/>
  <!--Identity transform (https://www.w3.org/TR/xslt#copying)-->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="/main">
    <xsl:copy>
      <!--To get the high level order elements, only apply-templates when order
      does not contain a non-empty ParentID child.-->
      <xsl:apply-templates 
        select="@*|order[not(string(ParentID))]"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="order">
    <xsl:copy>
      <!--Don't apply-templates to ParentID; we don't want to keep those.
      Do apply-templates to the key 'orderByParentId' when the key matches
      the current order's ID child.-->
      <xsl:apply-templates 
        select="@*|*[not(self::ParentID)]|key('orderByParentId',ID)"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

<main>
   <order>
      <ID>123</ID>
      <Name>ABC</Name>
      <order>
         <ID>4556</ID>
         <Name>AAA</Name>
      </order>
   </order>
</main>

将索引为n>1的所有order节点复制到第一个节点的一种方法是以下XSLT:

<?xml version = "1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="text()" />    <!-- suppresses copying of text() nodes -->
    <xsl:template match="main">        <!-- replicates the "main" node -->
      <main>
        <xsl:apply-templates />
      </main>
    </xsl:template>
    <xsl:template match="order[1]">    <!-- matches the first "order" node and copies all following ones -->
      <order>
        <xsl:copy-of select="*" />
        <xsl:copy-of select="following-sibling::order" />
      </order>   
    </xsl:template>    
</xsl:stylesheet>

输出如下所示:

<?xml version="1.0"?>
<main>
    <order>
        <ID>123</ID>
        <Name>ABC</Name>
        <order>
            <ID>4556</ID>
            <Name>AAA</Name>
            <ParentID>123</ParentID>
        </order>
    </order>
</main>

相关内容

  • 没有找到相关文章

最新更新