Xslt 平面XML上的XSL计数器

Xslt 平面XML上的XSL计数器,xslt,xslt-1.0,Xslt,Xslt 1.0,我试图在下面的源XML片段上维护一个序列号计数器。序列号位于目标OBX.1元素中。这是基于源中包含数据的元素NOS/POS/ROS。在本例中,由于所有3个元素都有数据,因此在OBX.1中生成序列1,2,3。但是,如果任何NOS/POS/ROS为空,则不应生成相应的OBX节点,但其余元素应按正确的顺序。我可以通过将OBX.1设置为: count(前面的同级::ns1:NOS[string length(.)>0]|前面的同级::top:POS[string length(.)>0])+1,但当您有

我试图在下面的源XML片段上维护一个序列号计数器。序列号位于目标OBX.1元素中。这是基于源中包含数据的元素NOS/POS/ROS。在本例中,由于所有3个元素都有数据,因此在OBX.1中生成序列1,2,3。但是,如果任何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>
<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>

123
添加
3456
2016-03-22T11:45:12.220000000
测试1
测试2
测试3
目标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>
<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>

1.
装货单
122
测试1
2.
装货单
111
测试2
3.
装货单
222
测试3

好的,如果您只选择了
NOS
POS
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中调用此模板一次。1.谢谢!,很高兴知道这一点。不幸的是,在这种情况下,如果OBX.3的值是a NOS/POS等,则OBX.3的值是相关的。