我無法轉換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
,因爲它似乎被覆蓋。
任何想法?如果有人能幫助我,我將非常感激!
感謝您的回答。我上週能夠完成翻譯,現在xsl正在使用。 – mRope