平面XML上的XSL计数器



我正试图在以下源XML片段上维护一个序列号计数器。序列号在目标OBX.1元素中。这是基于源中具有数据的元素NOS/POS/ROS。在这个例子中,由于所有3个元素都有数据,所以序列1、2、3是在OBX.1中生成的。然而,如果NOS/POS/ROS中的任何一个是空的,则不应生成相应的OBX节点,而其余元素应在正确的序列中。我可以通过将OBX.1设置为:count(前一个同级::ns1:NOS[string length(.)>0]|前一个同类::top:POS[string length(.)>0])+1,但当您有15个这样的元素时,它会变得乏味。有更好的方法来维护这个柜台吗?

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

如果您只选择NOSPOSROS元素(如果不为空),则可以使用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>

或者,您可以使用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>

相关内容

  • 没有找到相关文章

最新更新