Xslt xpath:select第n项返回所有
当我使用xpath时,请按照下面的xslt进行选择Xslt xpath:select第n项返回所有,xslt,select,xpath,Xslt,Select,Xpath,当我使用xpath时,请按照下面的xslt进行选择 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="urn:ROCK-BlueScope/ShipmentImportWS" exclude-result-prefixes="ns"> <xsl:temp
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="urn:ROCK-BlueScope/ShipmentImportWS"
exclude-result-prefixes="ns">
<xsl:template match="/">
<ManifestSourceM>
<xsl:for-each select="ns:Shipment/ns:ShipmentInformation">
<DSManifest>
<ManifestNo>
<xsl:value-of select="ns:GeneralShipmentInformation/ns:ShipmentIdentificationNumber"></xsl:value-of>
</ManifestNo>
<ManifestDate>
<xsl:value-of select="ns:DateTimeReference/ns:Date"></xsl:value-of>
</ManifestDate>
<PrimeMover>
<xsl:value-of select="ns:EquipmentDetailsLoop/ns:EquipmentDetails[ns:EquipmentStructure/ns:DescriptionCode = 'TV'][1]/ns:EquipmentStructure/ns:EquipmentNumber"></xsl:value-of>
</PrimeMover>
<Fleet1>
<xsl:value-of select="ns:EquipmentDetailsLoop/ns:EquipmentDetails[ns:EquipmentStructure/ns:DescriptionCode = 'TL'][1]/ns:EquipmentStructure/ns:EquipmentNumber[1]"></xsl:value-of>
</Fleet1>
<Fleet2>
<xsl:value-of select="ns:EquipmentDetailsLoop/ns:EquipmentDetails[ns:EquipmentStructure/ns:DescriptionCode = 'TL'][2]/ns:EquipmentStructure/ns:EquipmentNumber[2]"></xsl:value-of>
</Fleet2>
<Fleet3>
<xsl:value-of select="ns:EquipmentDetailsLoop/ns:EquipmentDetails[ns:EquipmentStructure/ns:DescriptionCode = 'TL'][3]/ns:EquipmentStructure/ns:EquipmentNumber[3]"></xsl:value-of>
</Fleet3>
<Fleet4>
<xsl:value-of select="ns:EquipmentDetailsLoop/ns:EquipmentDetails[ns:EquipmentStructure/ns:DescriptionCode = 'TL'][4]/ns:EquipmentStructure/ns:EquipmentNumber[4]"></xsl:value-of>
</Fleet4>
<Fleet5>
<xsl:value-of select="ns:EquipmentDetailsLoop/ns:EquipmentDetails[ns:EquipmentStructure/ns:DescriptionCode = 'TL'][5]/ns:EquipmentStructure/ns:EquipmentNumber[5]"></xsl:value-of>
</Fleet5>
<RouteCode>
<xsl:value-of select="ns:GeneralShipmentInformation/ns:StandardCarrierAlphaCode"></xsl:value-of>
</RouteCode>
<Description><xsl:value-of select="string-join(('BlueScope Load:', ns:GeneralShipmentInformation/ns:ShipmentIdentificationNumber, ' On RunCode:', ns:GeneralShipmentInformation/ns:StandardCarrierAlphaCode), '')"></xsl:value-of>
</Description>
<Description2></Description2>
</DSManifest>
</xsl:for-each>
</ManifestSourceM>
</xsl:template>
</xsl:stylesheet>
并将其应用于此xml
<?xml version="1.0" encoding="UTF-8"?>
<ns:Shipment xmlns:ns="urn:ROCK-BlueScope/ShipmentImportWS">
<ns:ShipmentInformation Transaction="Actual">
<ns:GeneralShipmentInformation>
<ns:TransactionSetPurposeCode>00</ns:TransactionSetPurposeCode>
<ns:TransportationMethodTypeCode>L</ns:TransportationMethodTypeCode>
<ns:ShipmentMethodOfPayment>DE</ns:ShipmentMethodOfPayment>
<ns:ShipmentIdentificationNumber>178896</ns:ShipmentIdentificationNumber>
<ns:StandardCarrierAlphaCode>NUNCOL</ns:StandardCarrierAlphaCode>
</ns:GeneralShipmentInformation>
<ns:Priority>0</ns:Priority>
<ns:DateTimeReference SegmentId="StartTime">
<ns:Date>2010-12-09</ns:Date>
<ns:Time>07:00:00</ns:Time>
</ns:DateTimeReference>
<ns:Origin>
<ns:GeographicLocation>
<ns:LocationIdentifier>NUN</ns:LocationIdentifier>
</ns:GeographicLocation>
</ns:Origin>
<ns:Destination>
<ns:GeographicLocation>
<ns:LocationIdentifier>~COMPLETE STEEL ROOFING</ns:LocationIdentifier>
</ns:GeographicLocation>
</ns:Destination>
<ns:EquipmentDetailsLoop>
<ns:EquipmentDetails>
<ns:EquipmentStructure>
<ns:Initial/>
<ns:EquipmentNumber>Z26GW</ns:EquipmentNumber>
<ns:DescriptionCode>TV</ns:DescriptionCode>
</ns:EquipmentStructure>
</ns:EquipmentDetails>
</ns:EquipmentDetailsLoop>
<ns:EquipmentDetailsLoop>
<ns:EquipmentDetails>
<ns:EquipmentStructure>
<ns:Initial/>
<ns:EquipmentNumber>B16KY-5</ns:EquipmentNumber>
<ns:DescriptionCode>TL</ns:DescriptionCode>
</ns:EquipmentStructure>
</ns:EquipmentDetails>
</ns:EquipmentDetailsLoop>
<ns:EquipmentDetailsLoop>
<ns:EquipmentDetails>
<ns:EquipmentStructure>
<ns:Initial/>
<ns:EquipmentNumber>B16KY-4</ns:EquipmentNumber>
<ns:DescriptionCode>TL</ns:DescriptionCode>
</ns:EquipmentStructure>
</ns:EquipmentDetails>
</ns:EquipmentDetailsLoop>
<ns:EquipmentDetailsLoop>
<ns:EquipmentDetails>
<ns:EquipmentStructure>
<ns:Initial/>
<ns:EquipmentNumber>B16KY-2</ns:EquipmentNumber>
<ns:DescriptionCode>TL</ns:DescriptionCode>
</ns:EquipmentStructure>
</ns:EquipmentDetails>
</ns:EquipmentDetailsLoop>
<ns:EquipmentDetailsLoop>
<ns:EquipmentDetails>
<ns:EquipmentStructure>
<ns:Initial/>
<ns:EquipmentNumber>B16KY-3</ns:EquipmentNumber>
<ns:DescriptionCode>TL</ns:DescriptionCode>
</ns:EquipmentStructure>
</ns:EquipmentDetails>
</ns:EquipmentDetailsLoop>
<ns:EquipmentDetailsLoop>
<ns:EquipmentDetails>
<ns:EquipmentStructure>
<ns:Initial/>
<ns:EquipmentNumber>B16KY-1</ns:EquipmentNumber>
<ns:DescriptionCode>TL</ns:DescriptionCode>
</ns:EquipmentStructure>
</ns:EquipmentDetails>
</ns:EquipmentDetailsLoop>
</ns:ShipmentInformation>
</ns:Shipment>
00
L
判定元件
178896
努科尔
0
2010-12-09
07:00:00
修女
~完整的钢屋顶
Z26GW
电视
B16KY-5
热释光
B16KY-4
热释光
B16KY-2
热释光
B16KY-3
热释光
B16KY-1
热释光
我明白了。Fleet1元素包含所有事件
<?xml version="1.0" encoding="UTF-8"?>
<ManifestSourceM>
<DSManifest>
<ManifestNo>178896</ManifestNo>
<ManifestDate>2010-12-09</ManifestDate>
<PrimeMover>Z26GW</PrimeMover>
<Fleet1>B16KY-5 B16KY-4 B16KY-2 B16KY-3 B16KY-1</Fleet1>
<Fleet2/>
<Fleet3/>
<Fleet4/>
<Fleet5/>
<RouteCode>NUNCOL</RouteCode>
<Description>BlueScope Load:178896 On RunCode:NUNCOL</Description>
<Description2/>
</DSManifest>
</ManifestSourceM>
178896
2010-12-09
Z26GW
B16KY-5 B16KY-4 B16KY-2 B16KY-3 B16KY-1
努科尔
BlueScope负载:178896运行代码:NUNCOL
我甚至试着用a表示每组,并选择…当特定于每次发生时,但仍然得到相同的结果
我不知道如何在choose…when方法中使用此选项
<xsl:number count="EquipmentDetailsLoop[normalize-space(EquipmentDetails/EquipmentStructure/DescriptionCode)='TL']" level="single"></xsl:number>
作为一个示例,此样式表:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="urn:ROCK-BlueScope/ShipmentImportWS"
exclude-result-prefixes="ns">
<xsl:strip-space elements="*">
<xsl:template match="ns:Shipment">
<ManifestSourceM>
<xsl:apply-templates/>
</ManifestSourceM>
</xsl:template>
<xsl:template match="ns:ShipmentInformation">
<DSManifest>
<xsl:apply-templates/>
</DSManifest>
</xsl:template>
<xsl:template match="ns:ShipmentIdentificationNumber">
<ManifestNo>
<xsl:value-of select="."/>
</ManifestNo>
</xsl:template>
<xsl:template match="ns:Date">
<ManifestDate>
<xsl:value-of select="."/>
</ManifestDate>
</xsl:template>
<xsl:template match="ns:EquipmentStructure[ns:DescriptionCode='TV']">
<PrimeMover>
<xsl:value-of select="ns:EquipmentNumber"/>
</PrimeMover>
</xsl:template>
<xsl:template match="ns:EquipmentStructure[ns:DescriptionCode='TL']">
<xsl:variable name="vNumber">
<xsl:number count="ns:EquipmentStructure[ns:DescriptionCode='TL']"
level="any"/>
</xsl:variable>
<xsl:element name="Fleet{$vNumber}">
<xsl:value-of select="ns:EquipmentNumber"/>
</xsl:element>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
输出:
<ManifestSourceM>
<DSManifest>
<ManifestNo>178896</ManifestNo>
<ManifestDate>2010-12-09</ManifestDate>
<PrimeMover>Z26GW</PrimeMover>
<Fleet1>B16KY-5</Fleet1>
<Fleet2>B16KY-4</Fleet2>
<Fleet3>B16KY-2</Fleet3>
<Fleet4>B16KY-3</Fleet4>
<Fleet5>B16KY-1</Fleet5>
</DSManifest>
</ManifestSourceM>
178896
2010-12-09
Z26GW
B16KY-5
B16KY-4
B16KY-2
B16KY-3
B16KY-1
注意:覆盖文本节点内置规则。模式匹配我们只想转换(更高层次)或转换和输出值(LEFS)的任何元素。使用xsl:element
指令命名数据驱动元素。使用xsl:number指令对层次结构进行编号。您的问题在于:
ns:EquipmentDetailsLoop
/ns:EquipmentDetails
[ns:EquipmentStructure
/ns:DescriptionCode = 'TL'
][1]
/ns:EquipmentStructure
/ns:EquipmentNumber[1]
这将从所有ns:EquipmentDetailsLop
子树中选择所需的ns:EquipmentNumber
因为您使用的是XSLT 2.0,
指令输出一个文本节点,其中包含节点集中每个节点的字符串值,由select
属性选择。因此,所有4个字符串都被输出
您想要的:
(/*/*/*/*/*[ns:DescriptionCode='TL']/ns:EquipmentNumber)[$k]
其中,$k
在范围内(必须用该范围内的每个整数替换一次):
1
到计数((/*/*/*/*/*/*[ns:DescriptionCode='TL']/ns:EquipmentNumber))
您确定总有5个“车队”吗?好问题,+1。请参阅我的答案,以获得一个补偿和一个简短而简单的解决方案。:)现在你让我对我的答案有些不确定。这个表达式不是只返回XPath 1.0中的第一个匹配项吗?@biziclop:如果您指的是OP的表达式,它会选择任何已选择节点的每个子节点——XPath 1.0和XPath 2.0都是这样。可能您指的是在XSLT1.0(不是XPath)中,
指令只使用由其select
属性选择的节点集的第一个节点。是的,这是真的。但是,OP使用的是XSLT 2.0,其中
为节点集中的每个节点输出一个文本节点。谢谢Dimitre的解释。@Tony-J:不客气。此时,公认的感恩方式是接受答案(点击答案旁边的绿色复选标记)。:)再次感谢亚历杭德罗帮我解除头痛。我不得不对Date元素进行一些更改,因为它将拾取所有实例(真正的xml包含更多的数据)。我刚刚将其从模板中删除,并将其作为DSManifest节点中的正常值添加。再次感谢。@Tony J:不客气。关于ns:Date
模式:使用更具体的模式,如ns:DateTimeReference/ns:Date
。