0

私のプロジェクトでは、以下のように最終的な出力構造 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>

ここでは、承認タグが複数回来ていますが、これは必須ではありません。一度だけ来るべきです。

Pls は、それを取得するためにコードにどのような変更を加えることができるかを提案します。これを行う代替方法または方法はありますか。

ありがとうアスマ

4

1 に答える 1

0

現時点では、InfoMsg 要素ごとに Endorsement 要素 (または LText 要素) を出力しているため示さているように要素が繰り返されます。

必要なことは、Endorsement要素を 1 回だけ出力し、その中で関連する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>
于 2013-06-26T07:44:09.537 に答える