2016-03-24 7 views
0

Aşağıdaki kaynak XML snippet'i üzerinden bir sıra numarası sayacı sürdürmeye çalışıyorum. Sıra numarası, hedef OBX.1 elemanında. Bu, içindeki veriye sahip olan kaynaktaki NOS/POS/ROS öğelerini temel alır. Bu örnekte, tüm 3 elemanlar veriye sahip olduğundan, dizi 1,2,3, OBX.1'lerde üretilir. Bununla birlikte, NOS/POS/ROS'tan herhangi biri boşsa, ilgili OBX düğümü üretilmemelidir, ancak kalan elemanlar doğru sırada olmalıdır. OBX.1 'i şu şekilde ayarlayabilirim: sayımı (önceki- kardeş :: ns1: NOS [string-length (.)> 0] | önceki-kardeş :: üst: POS [string-length (.)> 0]) + 1 ancak 15 tane elemanınız olduğunda yorucu oluyor. Bu sayacı sürdürmenin daha iyi bir yolu var mı?XSL Düz XML üzerinde sayaç

Kaynak XML Parçacığı:

<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> 

Hedef XML Parçacığı: Boş olmasaydı yalnızca NOS, POS veya ROS elemanları seçerek olsaydı

<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

kullanabilirsiniz. 1. – NNN

cevap

0

Eh, şunu kullanabilirsiniz position() işlevi, bu, hiyerarşideki konumu değil, seçilen düğüm kümesindeki düğümün konumunu döndürür.

<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> 

Alternatif Örneğin, ben ek bir şablon içinde yalnızca bir kez uzun ifadesini yazıp sadece her obx Bu şablonu çağıran zorunda kaldığı süre sayısını azalttı 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

Teşekkürler, bunu bilmek güzel. Ne yazık ki bu senaryoda, OBX.3 değeri bir NOS/POS vb. – NNN