我在转换 XML 消息的某些元素时遇到问题。我需要交换一些值,但是在将最后一个节点的值复制到第一个节点后,我无法达到第一个节点的原始值。
我一直在寻找几个小时,并在我的 XSL 中尝试了几种变体,但没有一个能给出令人满意的结果。我不是一个很有经验的 XSL 程序员,但我相信解决方案不会那么困难。我简化了原始消息来解释问题,我希望你们中的一个可以帮助我解决这个问题。让我通过下面的例子来解释:
来源:
<ProcessMessages>
<Message>
<SomeNode>Val</SomeNode>
<SomeNode>Val</SomeNode>
<Number>100000</Number>
<ExternalRefID>EXX12345600000001</ExternalRefID>
<SomeNode>Val</SomeNode>
<SomeNode>Val</SomeNode>
</Message>
<RelatedMessages>
<Message>
<SomeNode>Val</SomeNode>
<Number>200000</Number>
<ExternalRefID>EXX12345600000002</ExternalRefID>
<SomeNode>Val</SomeNode>
</Message>
<Message>
<SomeNode>Val</SomeNode>
<Number>300000</Number>
<ExternalRefID>EXX12345600000003</ExternalRefID>
<SomeNode>Val</SomeNode>
</Message>
</RelatedMessages>
</ProcessMessages>
期望的转变:
<ProcessMessages>
<Message>
<SomeNode>Val</SomeNode>
<SomeNode>Val</SomeNode>
<ExternalRefID>EXX12345600000003</ExternalRefID>
<SomeNode>Val</SomeNode>
<SomeNode>Val</SomeNode>
</Message>
<RelatedMessages>
<Message>
<Number>200000</Number>
<ExternalRefID>EXX12345600000002</ExternalRefID>
</Message>
<Message>
<Number>100000</Number>
<ExternalRefID>EXX12345600000001</ExternalRefID>
</Message>
</RelatedMessages>
</ProcessMessages>
我的 XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//ProcessMessages/Message/ExternalRefID">
<xsl:apply-templates select="//ProcessMessages/RelatedMessages/Message[last()]/ExternalRefID"/>
</xsl:template>
<xsl:template match="//ProcessMessages/Message/Number">
<xsl:apply-templates select="//ProcessMessages/RelatedMessages/Message[last()]/Number"/>
</xsl:template>
<xsl:template match="//ProcessMessages/RelatedMessages/Message[1]">
<xsl:element name="Message">
<xsl:apply-templates select="ExternalRefID"/>
<xsl:apply-templates select="Number"/>
</xsl:element>
</xsl:template>
<xsl:template match="//ProcessMessages/RelatedMessages/Message[2]">
<xsl:element name="Message">
<xsl:apply-templates select="//ProcessMessages/Message/ExternalRefID"/>
<xsl:apply-templates select="//ProcessMessages/Message/Number"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
当前结果
<ProcessMessages>
<Message>
<SomeNode>Val</SomeNode>
<SomeNode>Val</SomeNode>
<Number>100000</Number>
<ExternalRefID>EXX12345600000001</ExternalRefID>
<SomeNode>Val</SomeNode>
<SomeNode>Val</SomeNode>
</Message>
<RelatedMessages>
<Message>
<ExternalRefID>EXX12345600000002</ExternalRefID>
<Number>200000</Number>
</Message>
<Message>
<ExternalRefID>EXX12345600000001</ExternalRefID>
<Number>100000</Number>
</Message>
</RelatedMessages>
</ProcessMessages>
请注意,将 的值复制到后,ProcessMessages/RelatedMessages/Message
我ProcessMessages/Message
无法达到默认值,ProcessMessages/Message
因为它似乎被覆盖了。
有任何想法吗?如果有人可以帮助我,我将不胜感激!