Как получить тег корневого элемента только один раз для каждого цикла?
Мне нужно получить окончательную структуру вывода 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>..............
Чтобы достичь вышеупомянутой структуры вывода, я использую приведенный ниже фрагмент кода.
<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, если да, то он создает тег Endorsement, в противном случае он должен создавать тег 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>
Здесь тег одобрения приходит несколько раз, что не является необходимым. Это должно прийти только один раз.
Просьба предложить, какие изменения я могу сделать в своем коде, чтобы получить его. Есть ли альтернативный метод или способ сделать это.
Спасибо асма
1 ответ
В данный момент вы выводите элемент Endorsement (или элемент LText) для каждого имеющегося у вас элемента InfoMsg, и вы получаете повторяющиеся элементы, как показано.
Что вам нужно сделать, это просто вывести элемент одобрения только один раз, а затем выбрать соответствующие элементы 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>