Xml 如何在每个循环下仅获取一次根元素标记?
我需要为我的项目获得最终的输出结构xml,如下所示。但是我在这段代码中遇到了一些问题Xml 如何在每个循环下仅获取一次根元素标记?,xml,xslt,foreach,xsl-choose,Xml,Xslt,Foreach,Xsl Choose,我需要为我的项目获得最终的输出结构xml,如下所示。但是我在这段代码中遇到了一些问题 <Endorsement> <TL>STNDBY/CHG FEE/NO RFND/</TL> <TL>CXL BY FLT DT/</TL> </Endorsement> <LText TopicId="MISCELLANEOUS"> <TL>01 NVB28JUL/NVA28JUL</
<Endorsement>
<TL>STNDBY/CHG FEE/NO RFND/</TL>
<TL>CXL BY FLT DT/</TL>
</Endorsement>
<LText TopicId="MISCELLANEOUS">
<TL>01 NVB28JUL/NVA28JUL</TL>
</LText>
STNDBY/CHG费用/无RFND/
通过FLT DT实现CXL/
01 NVB28七月/NVA28七月
这是输入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>..............
0
2.
最后购票日期:2013年6月6日
0001
0
需要E-TKT
..............
要实现上面的输出结构,请使用下面的代码
<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是否等于01或1,如果是,则它创建背书标记,否则它应该构造Ltext标记。条件是背书元素中使用的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>
-
STNDBY/CHG费用/无RFND/
-
由FLT DT/
-
01 NVB28七月/NVA28七月
-
02 NVB28七月/NVA28七月
-
最后购票日期:2013年6月26日
-
需要E-TKT
-
附加税、附加费或费用可能适用
这里的签注标签来了
不必要的时间。它应该只来一次
请建议我可以在我的代码中做什么更改来获得它。有没有其他的方法或方法可以做到这一点
谢谢
Asma目前,您正在为您拥有的每个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>