Xslt 将多个xml元素转换为单个复杂xml元素
将多个xml元素转换为单个复杂xml元素 我想使用父值将子元素分组到一个复杂的xml中 在给定的示例中,源xml包含两条用于AUDIT_ID=1的xml记录 根据AUDIT_ID值,我们可以使用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
<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。这真的很有帮助。当然,如果我有进一步的变化,将创建一个新的职位。