Xslt 将多个xml元素转换为单个复杂xml元素

Xslt 将多个xml元素转换为单个复杂xml元素,xslt,Xslt,将多个xml元素转换为单个复杂xml元素 我想使用父值将子元素分组到一个复杂的xml中 在给定的示例中,源xml包含两条用于AUDIT_ID=1的xml记录 根据AUDIT_ID值,我们可以使用xslt将目标xml中给出的两个值合并为一个吗 源xml: <Header> <Audit_records> <AUDIT_ID>1</AUDIT_ID> <ESI_ID>100</ESI_ID> <ESI_NAME>AB

将多个xml元素转换为单个复杂xml元素

我想使用父值将子元素分组到一个复杂的xml中

在给定的示例中,源xml包含两条用于AUDIT_ID=1的xml记录

根据AUDIT_ID值,我们可以使用xslt将目标xml中给出的两个值合并为一个吗

源xml:

<Header>
<Audit_records>
<AUDIT_ID>1</AUDIT_ID>
<ESI_ID>100</ESI_ID>
<ESI_NAME>AB</ESI_NAME>
</Audit_records>
<Audit_records>
<AUDIT_ID>1</AUDIT_ID>
<ESI_ID>101</ESI_ID>
<ESI_NAME>BC</ESI_NAME>
</Audit_records>
<Audit_records>
<AUDIT_ID>2</AUDIT_ID>
<ESI_ID>103</ESI_ID>
<ESI_NAME>TH</ESI_NAME>
</Audit_records>
<Audit_records>
<AUDIT_ID>2</AUDIT_ID>
<ESI_ID>104</ESI_ID>
<ESI_NAME>UI</ESI_NAME>
</Audit_records>
</Header>

1.
100
AB
1.
101
卑诗省
2.
103
真实航向
2.
104
用户界面
目标Xml:

<Header>
<Audit_records>
<AUDIT_ID>1</AUDIT_ID>
<ESI>
<ESI_ID>100</ESI_ID>
<ESI_NAME>AB</ESI_NAME>
</ESI>
<ESI>
<ESI_ID>101</ESI_ID>
<ESI_NAME>BC</ESI_NAME>
</ESI>
</Audit_records>
<Audit_records>
<AUDIT_ID>2</AUDIT_ID>
<ESI>
<ESI_ID>103</ESI_ID>
<ESI_NAME>TH</ESI_NAME>
</ESI>
<ESI>
<ESI_ID>104</ESI_ID>
<ESI_NAME>UI</ESI_NAME>
</ESI>
</Audit_records>
</Header>

1.
100
AB
101
卑诗省
2.
103
真实航向
104
用户界面
使用的xslt:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0"
                xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
                xmlns:ns0="http://xmlns.oracle.com/pcbpel/adapter/db/getrecord"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                  xmlns:ns1="http://xmlns.oracle.com/ATAS_BPEL">
<!--<xsl:key name="myaudit" match="/ns0:getrecordOutputCollection/ns0:getrecordOutput" use="/ns0:getrecordOutputCollection/ns0:getrecordOutput/ns0:AUDIT_ID"/> -->
  <xsl:key match="Audit_records" name="myaudit" use="AUDIT_ID"/>
  <xsl:template match="/">
    <ns1:Header>
      <xsl:for-each select="/ns0:Header/ns0:Audit_records[generate-id() = generate-id(key('myaudit',AUDIT_ID)[1])]">
      <xsl:sort select="AUDIT_ID" order="ascending" data-type="number" />
        <ns1:CARF>
          <ns1:Header>
            <ns1:AUDIT_ID>
              <xsl:value-of select="ns0:AUDIT_ID"/>
            </ns1:AUDIT_ID>
            <ns1:ESI >
                <ns1:ESI_ID>
                  <xsl:value-of select="key('myaudit',AUDIT_ID)/ns0:ESI_ID"/>
                </ns1:ESI_ID>
                <ns1:ESI_NAME>
                  <xsl:value-of select="key('myaudit',AUDIT_ID)/ns0:ESI_NAME"/>
                </ns1:ESI_NAME>
            </ns1:ESI>
          </ns1:Header>
        </ns1:CARF>
      </xsl:for-each>
    </ns1:AUDITRECORDS>
  </xsl:template>
</xsl:stylesheet>

您的XSLT正在使用名称空间,但您的示例输入/所需输出没有使用名称空间

下面是一些应该让您开始的内容,但是您必须针对实际数据中的任何名称空间对其进行修改

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="records" match="Audit_records" use="AUDIT_ID"/>

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

  <xsl:template match="Header">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:for-each select="Audit_records[generate-id()=generate-id(key('records',AUDIT_ID)[1])]">
        <xsl:copy>
          <xsl:apply-templates select="@*|AUDIT_ID"/>
          <xsl:for-each select="key('records',AUDIT_ID)">
            <ESI>
              <xsl:apply-templates select="*[not(self::AUDIT_ID)]"/>
            </ESI>            
          </xsl:for-each>
        </xsl:copy>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>


小提琴:这是一个分组问题。进行搜索-这可能是这里最常被问到的XSLT问题。请注意,对于使用OracleJDEV工具进行XSLT转换的XSLT1.0或2.0.am,答案是不同的。在当前的jdev vresion xslt中,不支持每个组的xsl:key或xsl:for。有没有其他简单的方法来实现这一点?如果不支持
xsl:key
,那么您就没有使用XSLT,我不知道什么对您有效,什么对您无效。也许您可以使用这种方法:我有一段XSLT正在使用。但是没有得到很好的回应。你能帮忙吗谢谢丹尼尔。你能让我知道下面的代码将做什么@AjayShetty-这就是问题所在。它基本上复制了其他模板未按原样处理的所有内容。谢谢@Daniel haley。我刚刚更新了我使用的源、目标和xslt。不确定问题在于我在xslt中使用的名称空间或逻辑。你能帮我吗help@AjayShetty-更改问题中的示例将使问题的其余部分以及此答案无效。下次创建一个新问题。您始终可以在新问题中包含指向上一个问题的链接。我将恢复您的更改,以便问题和答案仍然有意义。这里有一个更新的提琴,使用你的新输入和期望的输出:如果你仍然有问题,请创建一个新的问题。非常感谢Daniel。这真的很有帮助。当然,如果我有进一步的变化,将创建一个新的职位。