Xslt 比较2个XML并生成一个已排序的XML
我需要通过比较2个XML中的数据来创建最终的XML 源XML:Xslt 比较2个XML并生成一个已排序的XML,xslt,Xslt,我需要通过比较2个XML中的数据来创建最终的XML 源XML: <multimap:Messages xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge"> <multimap:Message1> <FSE_BKLOG xmlns:ns1="http://www.w3.org/2005/Atom" xmlns:ns2="http://schemas.microsoft
<multimap:Messages xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge">
<multimap:Message1>
<FSE_BKLOG xmlns:ns1="http://www.w3.org/2005/Atom"
xmlns:ns2="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
xmlns:ns3="http://schemas.microsoft.com/ado/2007/08/dataservices"
xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<FSE_BKLOGType>
<FSE_ID>1</FSE_ID>
<TICKET_TYPE>T</TICKET_TYPE>
<T_COUNT>259</T_COUNT>
</FSE_BKLOGType>
<FSE_BKLOGType>
<FSE_ID>2</FSE_ID>
<TICKET_TYPE>T</TICKET_TYPE>
<T_COUNT>128</T_COUNT>
</FSE_BKLOGType>
<FSE_BKLOGType>
<FSE_ID>3</FSE_ID>
<TICKET_TYPE>T</TICKET_TYPE>
<T_COUNT>76</T_COUNT>
</FSE_BKLOGType>
</FSE_BKLOG>
</multimap:Message1>
<multimap:Message2>
<FSE_BKLOG>
<FSE_BKLOGType>
<FSE_ID>2</FSE_ID>
<T_COUNT>101</T_COUNT>
<TICKET_TYPE>T</TICKET_TYPE>
</FSE_BKLOGType>
<FSE_BKLOGType>
<FSE_ID>3</FSE_ID>
<T_COUNT>101</T_COUNT>
<TICKET_TYPE>T</TICKET_TYPE>
</FSE_BKLOGType>
<FSE_BKLOGType>
<FSE_ID>4</FSE_ID>
<T_COUNT>100</T_COUNT>
<TICKET_TYPE>T</TICKET_TYPE>
</FSE_BKLOGType>
</FSE_BKLOG>
</multimap:Message2>
</multimap:Messages>
<Message>
<FSE_BKLOGType>
<Method>POST</Method>
<FSE_ID>1</FSE_ID>
<TICKET_TYPE>T</TICKET_TYPE>
<T_COUNT>259</T_COUNT>
</FSE_BKLOGType>
<FSE_BKLOGType>
<Method>PUT</Method>
<FSE_ID>2</FSE_ID>
<TICKET_TYPE>T</TICKET_TYPE>
<T_COUNT>128</T_COUNT>
</FSE_BKLOGType>
<FSE_BKLOGType>
<Method>PUT</Method>
<FSE_ID>3</FSE_ID>
<TICKET_TYPE>T</TICKET_TYPE>
<T_COUNT>76</T_COUNT>
</FSE_BKLOGType>
</FSE_BKLOG>
</Message>
1.
T
259
2.
T
128
3.
T
76
2.
101
T
3.
101
T
4.
100
T
我的要求是进入Message1/FSE_BKLOG/FSE_BKLOGType/FSE_ID和
将FSE_ID与Message2/FSE_BKLOG/FSE_BKLOGType/FSE_ID中的一个进行比较
如果值匹配,则最终值xml将放置在其他位置
目标XML:
<multimap:Messages xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge">
<multimap:Message1>
<FSE_BKLOG xmlns:ns1="http://www.w3.org/2005/Atom"
xmlns:ns2="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
xmlns:ns3="http://schemas.microsoft.com/ado/2007/08/dataservices"
xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<FSE_BKLOGType>
<FSE_ID>1</FSE_ID>
<TICKET_TYPE>T</TICKET_TYPE>
<T_COUNT>259</T_COUNT>
</FSE_BKLOGType>
<FSE_BKLOGType>
<FSE_ID>2</FSE_ID>
<TICKET_TYPE>T</TICKET_TYPE>
<T_COUNT>128</T_COUNT>
</FSE_BKLOGType>
<FSE_BKLOGType>
<FSE_ID>3</FSE_ID>
<TICKET_TYPE>T</TICKET_TYPE>
<T_COUNT>76</T_COUNT>
</FSE_BKLOGType>
</FSE_BKLOG>
</multimap:Message1>
<multimap:Message2>
<FSE_BKLOG>
<FSE_BKLOGType>
<FSE_ID>2</FSE_ID>
<T_COUNT>101</T_COUNT>
<TICKET_TYPE>T</TICKET_TYPE>
</FSE_BKLOGType>
<FSE_BKLOGType>
<FSE_ID>3</FSE_ID>
<T_COUNT>101</T_COUNT>
<TICKET_TYPE>T</TICKET_TYPE>
</FSE_BKLOGType>
<FSE_BKLOGType>
<FSE_ID>4</FSE_ID>
<T_COUNT>100</T_COUNT>
<TICKET_TYPE>T</TICKET_TYPE>
</FSE_BKLOGType>
</FSE_BKLOG>
</multimap:Message2>
</multimap:Messages>
<Message>
<FSE_BKLOGType>
<Method>POST</Method>
<FSE_ID>1</FSE_ID>
<TICKET_TYPE>T</TICKET_TYPE>
<T_COUNT>259</T_COUNT>
</FSE_BKLOGType>
<FSE_BKLOGType>
<Method>PUT</Method>
<FSE_ID>2</FSE_ID>
<TICKET_TYPE>T</TICKET_TYPE>
<T_COUNT>128</T_COUNT>
</FSE_BKLOGType>
<FSE_BKLOGType>
<Method>PUT</Method>
<FSE_ID>3</FSE_ID>
<TICKET_TYPE>T</TICKET_TYPE>
<T_COUNT>76</T_COUNT>
</FSE_BKLOGType>
</FSE_BKLOG>
</Message>
邮递
1.
T
259
放
2.
T
128
放
3.
T
76
这就是我所尝试的:
这给了我一些常见的信息,但忽略了message1中的信息
<xsl:template match="/">
<ns2:Messages>
<Message1>
<FSE_BKLOG>
<xsl:for-each select="/ns2:Messages/ns2:Message1/FSE_BKLOG/FSE_BKLOGType">
<xsl:variable name="pos" select="position()"/>
<xsl:for-each select="/ns2:Messages/ns2:Message2/FSE_BKLOG/FSE_BKLOGType">
<xsl:choose>
<xsl:when test="/ns2:Messages/ns2:Message1/FSE_BKLOG/FSE_BKLOGType[$pos]/FSE_ID = FSE_ID">
<FSE_BKLOGType>
<METHOD>PUT</METHOD>
<FSE_ID>
<xsl:value-of select="/ns2:Messages/ns2:Message1/FSE_BKLOG/FSE_BKLOGType[$pos]/FSE_ID"/>
</FSE_ID>
<T_COUNT>
<xsl:value-of select="/ns2:Messages/ns2:Message1/FSE_BKLOG/FSE_BKLOGType[$pos]/T_COUNT"/>
</T_COUNT>
<TICKET_TYPE>
<xsl:value-of select="/ns2:Messages/ns2:Message1/FSE_BKLOG/FSE_BKLOGType[$pos]/TICKET_TYPE"/>
</TICKET_TYPE>
</FSE_BKLOGType>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:for-each>
</FSE_BKLOG>
</Message1>
</ns2:Messages>
</xsl:template>
放
谢谢
Yatan我建议您使用从输入XML的另一个分支查找值。下面是一个简单的例子: XSLT1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="msg2" match="multimap:Message2/FSE_BKLOG/FSE_BKLOGType" use="FSE_ID" />
<xsl:template match="/multimap:Messages">
<Message>
<xsl:for-each select="multimap:Message1/FSE_BKLOG/FSE_BKLOGType">
<xsl:copy>
<Method>
<xsl:choose>
<xsl:when test="key('msg2', FSE_ID)">PUT</xsl:when>
<xsl:otherwise>POST</xsl:otherwise>
</xsl:choose>
</Method>
<xsl:copy-of select="*"/>
</xsl:copy>
</xsl:for-each>
</Message>
</xsl:template>
</xsl:stylesheet>
放
邮递
注意:我没有费心删除复制到输出的冗余名称空间声明,因为(a)这不是问题的重点,(b)确切的方法取决于您可以使用的XSLT版本(请参阅:).我建议您使用从输入XML的另一个分支查找值。下面是一个简单的例子: XSLT1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="msg2" match="multimap:Message2/FSE_BKLOG/FSE_BKLOGType" use="FSE_ID" />
<xsl:template match="/multimap:Messages">
<Message>
<xsl:for-each select="multimap:Message1/FSE_BKLOG/FSE_BKLOGType">
<xsl:copy>
<Method>
<xsl:choose>
<xsl:when test="key('msg2', FSE_ID)">PUT</xsl:when>
<xsl:otherwise>POST</xsl:otherwise>
</xsl:choose>
</Method>
<xsl:copy-of select="*"/>
</xsl:copy>
</xsl:for-each>
</Message>
</xsl:template>
</xsl:stylesheet>
放
邮递
注意:我没有费心删除复制到输出中的冗余名称空间声明,因为(a)这不是问题的重点,(b)确切的方法取决于您可以使用的XSLT版本(请参阅:)。我已经用我尝试过的方法进行了更新。请告诉我们您将使用哪个XSLT处理器(XSLT 1.0或2.0)。我已经用我尝试过的内容进行了更新。请告诉我们您将使用哪个XSLT处理器(XSLT 1.0或2.0)。