2016-03-24 3 views
0

次のソースXMLスニペットに対してシーケンス番号カウンタを維持しようとしています。シーケンス番号は、ターゲットOBX.1要素内にあります。これは、ソース内のデータを持つNOS/POS/ROSの要素に基づいています。この例では、3つの要素すべてにデータがあるため、OBX.1のシーケンス1,2,3が生成されます。ただし、NOS/POS/ROSのいずれかが空の場合、対応するOBXノードは生成されませんが、残りの要素は正しい順序でなければなりません。count(previous-sibling :: ns1:NOS [string-length(。)> 0] | preceding-sibling :: top:POS [string-length(。)> OBX.1を設定すると、 0])+ 1ですが、そのような要素が15個あると面倒です。このカウンタを維持するためのより良い方法はありますか?フラットXML上のXSLカウンタ

ソースXMLスニペット:

<ns1:HladtCollection xmlns:ns1="http://xmlns.oracle.com/pcbpel/adapter/db/top/ReadAdtHistorical"> 
     <ns1:Hladt> 
      <ns1:ADTMessageID>123</ns1:ADTMessageID> 
      <ns1:ADTMessageType>ADD</ns1:ADTMessageType> 
      <ns1:AccountNumber>3456</ns1:AccountNumber> 
      <ns1:ArrivalDate>2016-03-22T11:45:12.220000000</ns1:ArrivalDate> 
      <ns1:NOS>Test1</ns1:NOS> 
      <ns1:POS>Test2</ns1:POS> 
      <ns1:ROS>Test3</ns1:ROS> 
     </ns1:Hladt> 
</ns1:HladtCollection> 

ターゲットXMLスニペット:

<ns1:OBX> 
    <ns1:OBX.1>1</ns1:OBX.1> 
    <ns1:OBX.2>ST</ns1:OBX.2> 
    <ns1:OBX.3> 
    <ns1:CE_OBS.1> 
     <ns1:CM_OBS.1>122</ns1:CM_OBS.1> 
    </ns1:CE_OBS.1> 
    </ns1:OBX.3> 
    <ns1:OBX.5>Test1</ns1:OBX.5> 
</ns1:OBX> 
<ns1:OBX> 
    <ns1:OBX.1>2</ns1:OBX.1> 
    <ns1:OBX.2>ST</ns1:OBX.2> 
    <ns1:OBX.3> 
    <ns1:CE_OBS.1> 
     <ns1:CM_OBS.1>111</ns1:CM_OBS.1> 
    </ns1:CE_OBS.1> 
    </ns1:OBX.3> 
    <ns1:OBX.5>Test2</ns1:OBX.5> 
</ns1:OBX> 
<ns1:OBX> 
    <ns1:OBX.1>3</ns1:OBX.1> 
    <ns1:OBX.2>ST</ns1:OBX.2> 
    <ns1:OBX.3> 
    <ns1:CE_OBS.1> 
     <ns1:CM_OBS.1>222</ns1:CM_OBS.1> 
    </ns1:CE_OBS.1> 
    </ns1:OBX.3> 
    <ns1:OBX.5>Test3</ns1:OBX.5> 
</ns1:OBX> 
+0

使用することができます。 1。 – NNN

答えて

0

さて、あなただけの空がなかったら、あなたが使用することができ、あなたのNOSPOSまたはROS要素を選択している場合position()関数は、階層内の位置ではなく、選択したノードセット内のノードの位置を返します。

<xsl:for-each select="(ns1:NOS|ns1:POS|ns1:ROS)[. != '']"> 
    <ns1:OBX> 
     <ns1:OBX.1><xsl:value-of select="position()" /> </ns1:OBX.1> 
     <ns1:OBX.5><xsl:value-of select="." /></ns1:OBX.5> 
    </ns1:OBX> 
</xsl:for-each> 

またたとえば、あなたは私が追加のテンプレートに一度だけに長い式を入力し、ちょうど各OBXでこのテンプレートを呼び出す必要があった回数を削減xsl:number

<xsl:for-each select="ns1:NOS|ns1:POS|ns1:ROS"> 
    <xsl:if test=". != ''"> 
     <ns1:OBX> 
     <ns1:OBX.1><xsl:number count="ns1:NOS[. != '']|ns1:POS[. != '']|ns1:ROS[. != '']" /> </ns1:OBX.1> 
      <ns1:OBX.5><xsl:value-of select="." /></ns1:OBX.5> 
     </ns1:OBX> 
    </xsl:if> 
</xsl:for-each> 
+0

ありがとうございます、これは知っておいてよかったです。残念ながら、このシナリオではOBX.3の値はNOS/POSなどの場合に依存します。 – NNN

関連する問題