我有一个输入XML,必须使用XSLT将其重组为另一个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个循环并在单循环中获得结果。 输出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>
注意:这些代码仅是示例,实际上是字母数字,并非可排序。
答案 0 :(得分:0)
怎么样:
<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>
答案 1 :(得分:-1)
<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="Rejection[3]"/>
<xsl:apply-templates select="Rejection[1]"/>
<xsl:apply-templates select="Rejection[2]"/>
</xsl:copy>
</xsl:template>
You may simply apply according to your need.