2017-08-10 8 views
0

xslは、別の値がtrueかfalseかに応じてxml要素の値をマップします。以前はxslでブール演算子を使用しようとしたことはありませんでしたが、なぜ動作していないのかわかりません。AND演算子がxslファイルで評価されていない

ここで一部と私のXSLからの抽出物は、私が問題を抱えている:私は注文が入って来ているし、私は「ProcessNameのを」要素の値を評価しています

基本的に
<xsl:choose> 
    <xsl:when test="contains(payload/orderItem/processName, 'ResetPilotPassword') and /payload/orderItem/UsingOldSip = 'true'"> 
     <serviceId> 
      <xsl:value select="/payload/orderItem/service/externalIds/externalId[displayName = 'MPLS ID']/externalId"/> 
     </serviceId> 
    </xsl:when> 

    <xsl:when test="contains(payload/orderItem/processName, 'ResetPilotPassword') and /payload/orderItem/UsingOldSip = 'false'"> 
     <serviceId> 
      <xsl:value-of select="payload/orderItem/bearerServiceIdentifier"/> 
     </serviceId> 
    </xsl:when> 

    <xsl:otherwise> 
     <serviceId> 
      null 
     </serviceId> 
    </xsl:otherwise> 
</xsl:choose> 

と"UseIldSip"を使用して、要素 "serviceId"に割り当てる値を決定します。しかし、要素には正しい値の代わりにnullが設定されています。これらの値はこのxslに達する前に正しく順序付けされているため、「と」の実装方法に間違いがあります。ここにオペレータ。誰かが問題が何かを見ることができますか?私は各条件の周りに、テスト全体の周りに括弧を入れてみました、そして、それはまだ動作していません。事前に

おかげ

EDIT 1: サンプル入力XML要求されるように。実際のXMLは、はるかに多くの要素が含まれていますが、私は必要とする重要な要素は、次のようになります。

<xsl:template match="payload/orderItem"> 
    <xsl:choose> 
     <xsl:when test="contains(processName/text(), 'ResetPilotPassword') and UsingOldSip/text() = 'true'"> 
      <serviceId> 
       <xsl:value select="service/externalIds/externalId[displayName = 'MPLS ID']/externalId/text()"/> 
      </serviceId> 
     </xsl:when> 

     <xsl:when test="contains(processName/text(), 'ResetPilotPassword') and UsingOldSip/text() = 'false'"> 
      <serviceId> 
       <xsl:value-of select="bearerServiceIdentifier/text()"/> 
      </serviceId> 
     </xsl:when> 

     <xsl:otherwise> 
      <serviceId> 
       null 
      </serviceId> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

か、であれば:あなたは、いくつかのorderItemの要素を持っている場合、あなたはこのような何かを持っている必要があり

<orderItem xmlns="http://gatewayNamespace"> 
    <processName>orderResetPilotPassword</processName>   
    <orderId>12345</orderId> 
    <accountId>56789</accountId> 
    <emailAddress>[email protected]</emailAddress> 
    <UsingOldSip>true</UsingOldSip> 
</orderItem> 
+0

ソースコードを再フォーマットして、水平スクロールバーが消えるようにしてください。 – reporter

+0

入力XMLのサンプルも表示できますか?ありがとうございました! –

+0

私は何の問題も見ていません。あなたのXMLタグのパスに何か問題がありますか?XMLを表示してください。 –

答えて

0

別のテンプレート要素:

<xsl:for-each select="/payload/orderItem"> 
    <xsl:choose> 
     <xsl:when test="contains(processName/text(), 'ResetPilotPassword') and UsingOldSip/text() = 'true'"> 
      <serviceId> 
       <xsl:value select="service/externalIds/externalId[displayName = 'MPLS ID']/externalId/text()"/> 
      </serviceId> 
     </xsl:when> 

     <xsl:when test="contains(processName/text(), 'ResetPilotPassword') and UsingOldSip/text() = 'false'"> 
      <serviceId> 
       <xsl:value-of select="bearerServiceIdentifier/text()"/> 
      </serviceId> 
     </xsl:when> 

     <xsl:otherwise> 
      <serviceId> 
       null 
      </serviceId> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:for-each> 
+0

応答をありがとうが、私はXML内に1つのorderItem要素しか持っていません。一番上の要素ですが、他の要素はすべてその要素に含まれています。私はあなたの "text()"の使用について興味があります。これを使う利点は何ですか? – Eoin

+0

@Eonそれは要素自体ではなく要素の内部にあるテキストを提供します –

関連する問題