XSLTを使用して別のXMLに再構築する必要がある入力XMLがあります。着信XMLは次のようになります
<Header>
<Rejection>
<Code>Code1</Code>
<Text>Text1</Text>
</Rejection>
<Rejection>
<Code>Code2</Code>
<Text>Text2</Text>
</Rejection>
<Rejection>
<Code>Code3</Code>
<Text>Text3</Text>
</Rejection>
</Header>
拒否のコード値がCode3の場合は常に、Code3 / Text3タグを最初のタグにする必要があります。Code3の位置は、着信XMLのどこにあってもかまいませんが、出力の最初の拒否タグである必要があります。これは私の現在のXSLTです
<xsl:for-each select="/Header/Rejection">
<xsl:if test ="Code='Code3'">
<REJECTION>
<REJECTCODE><xsl:value-of select="Code"></xsl:value-of></REJECTCODE>
<REJECTREASON><xsl:value-of select="Text"></xsl:value-of></REJECTREASON>
</REJECTION>
</xsl:if>
</xsl:for-each>
<xsl:for-each select="/Header/Rejection">
<xsl:if test ="not(Code='Code3')">
<REJECTION>
<REJECTCODE><xsl:value-of select="Code"></xsl:value-of></REJECTCODE>
<REJECTREASON><xsl:value-of select="Text"></xsl:value-of></REJECTREASON>
</REJECTION>
</xsl:if>
</xsl:for-each>
これで、2つのループを防ぎ、結果を1つのループで取得する方法があります。出力XMLは次のようにする必要があります。
<Header>
<REJECTION>
<REJECTCODE>Code3</REJECTCODE>
<REJECTREASON>Text3</REJECTREASON>
</REJECTION>
<REJECTION>
<REJECTCODE>Code1</REJECTCODE>
<REJECTREASON>Text1</REJECTREASON>
</REJECTION>
<REJECTION>
<REJECTCODE>Code2</REJECTCODE>
<REJECTREASON>Text2</REJECTREASON>
</REJECTION>
</Header>
注:コードは単なるサンプルです。実際には英数字であり、並べ替え可能な順序ではありません。
どうですか:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/Header">
<xsl:copy>
<xsl:apply-templates select="Rejection">
<xsl:sort select="number(Code='Code3')" data-type="number" order="descending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="Rejection">
<REJECTION>
<REJECTCODE>
<xsl:value-of select="Code"/>
</REJECTCODE>
<REJECTREASON>
<xsl:value-of select="Text"/>
</REJECTREASON>
</REJECTION>
</xsl:template>
</xsl:stylesheet>
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加