我需要为我的项目获得如下的最终输出结构xml。但是这个代码我遇到的问题很少。
<Endorsement>
<TL>STNDBY/CHG FEE/NO RFND/</TL>
<TL>CXL BY FLT DT/</TL>
</Endorsement>
<LText TopicId="MISCELLANEOUS">
<TL>01 NVB28JUL/NVA28JUL</TL>
</LText>
这是输入的xml文件
<InfoMsg>
<AppNum>0</AppNum>
<MsgType>2</MsgType>
<Text>LAST DATE TO PURCHASE TICKET: 06JUN13</Text>
</InfoMsg>
<InfoMsg>
<UniqueKey>0001</UniqueKey>
<Lang>0</Lang>
<Text>E-TKT REQUIRED</Text>
</InfoMsg>..............
为了实现上述输出结构OI'使用下面的代码
<xsl:for-each select="../InfoMsg">
<xsl:choose>
<xsl:when test="MsgType='01' or MsgType='1'">
<xsl:element name="Endorsement">
<xsl:element name="TL">
<xsl:value-of select="Text"/>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="LText">
<xsl:attribute name="TopicId">
<xsl:text>MISCELLANEOUS</xsl:text>
</xsl:attribute>
<xsl:element name="TL">
<xsl:value-of select="Text"/>
</xsl:element>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
这里的逻辑是,对于每个Info Msg标记,它应检查MSgType是否为eqaul为01或1,如果是,则它创建Endorsement标记,否则它应该构造Ltext标记。条件是在Endorsement元素中使用的Msgtype不应重复在Ltext标签中。
但它让我低于输出
- <Endorsement>
<TL>STNDBY/CHG FEE/NO RFND/</TL>
</Endorsement>
- <Endorsement>
<TL>CXL BY FLT DT/</TL>
</Endorsement>
- <LText TopicId="MISCELLANEOUS">
<TL>01 NVB28JUL/NVA28JUL</TL>
</LText>
- <LText TopicId="MISCELLANEOUS">
<TL>02 NVB28JUL/NVA28JUL</TL>
</LText>
- <LText TopicId="MISCELLANEOUS">
<TL>LAST DATE TO PURCHASE TICKET: 26JUN13</TL>
</LText>
- <LText TopicId="MISCELLANEOUS">
<TL>E-TKT REQUIRED</TL>
</LText>
- <LText TopicId="MISCELLANEOUS">
<TL>ADDITIONAL TAXES, SURCHARGES, OR FEES MAY APPLY</TL>
</LText>
此处背书标签即将推出多个 没有必要的时间。它应该只出现一次。
请提示我可以在我的代码中进行哪些更改以获得它。有没有其他方法或方法可以做到这一点。
由于 阿斯马贾
答案 0 :(得分:0)
目前,您正在为每个 InfoMsg 元素输出认可元素(或 LText 元素),这样您就可以获得你展示的重复元素。
您需要做的只是输出认可元素一次,然后在其中选择相关的 InfoMsg 元素。
<Endorsement>
<xsl:for-each select="InfoMsg[MsgType='01' or MsgType='1']">
<TL>
<xsl:value-of select="Text"/>
</TL>
</xsl:for-each>
</Endorsement>
同样适用于 Ltext 。
注意这里不需要使用 xsl:element ,只需直接输出元素。
实际上,您可能应该在此处使用模板匹配,以允许您重用代码。试试这个XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<Endorsement>
<xsl:apply-templates select="InfoMsg[MsgType='01' or MsgType='1']" />
</Endorsement>
<LText TopicId="MISCELLANEOUS">
<xsl:apply-templates select="InfoMsg[not(MsgType='01' or MsgType='1')]" />
</LText>
</xsl:template>
<xsl:template match="InfoMsg">
<TL>
<xsl:value-of select="Text"/>
</TL>
</xsl:template>
</xsl:stylesheet>