我正试图在以下源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>
如果您只选择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>
或者,您可以使用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>