我有以下xml文档:
<GetGeneralServiceRequestByReferenceValueResponse xmlns="http://www.caps-solutions.co.uk/webservices/connectors/731/servicerequest/messagetypes">
<GeneralServiceRequest xmlns="http://www.caps-solutions.co.uk/schema/uniform/731/servicerequest/sr/srtypes">
<ServiceRequestIdentification>
<ServiceRequestTechnicalKey>PG7ECIJBKFX00</ServiceRequestTechnicalKey>
<ReferenceValue>18/009969/S_SCBC</ReferenceValue>
<AlternativeReferences>
<AlternativeReference xmlns="http://www.caps-solutions.co.uk/schema/uniform/72b/common/uniformtypes">
<ReferenceValue>W44811182451</ReferenceValue>
<ReferenceType>UTRN</ReferenceType>
</AlternativeReference>
<AlternativeReference xmlns="http://www.caps-solutions.co.uk/schema/uniform/72b/common/uniformtypes">
<ReferenceValue>00482</ReferenceValue>
<ReferenceType>BAD</ReferenceType>
</AlternativeReference>
</AlternativeReferences>
<SiteID>JB</SiteID>
</ServiceRequestIdentification>
</GeneralServiceRequest>
</GetGeneralServiceRequestByReferenceValueResponse>
我需要选择<ReferenceValue>
的兄弟<ReferenceType>
为“ UTRN”
以下xpath是最后一个<ReferenceValue>
引用的<Alternative>
。
/*[local-name()='GetGeneralServiceRequestByReferenceValueResponse']/*[local-name()='GeneralServiceRequest']/*[local-name()='ServiceRequestIdentification']/*[local-name()='AlternativeReferences']/*[local-name()='AlternativeReference']/*[local-name()='ReferenceValue']
我尝试使用[]作为父AlternativeReference节点,然后使用ReferenceValue ='UTRN',但无法获得所需的输出。
答案 0 :(得分:2)
请勿使用local-name()
。在XSLT中声明名称空间,并使用前缀。
例如,这样声明它们(您可以选择任何喜欢的前缀,只要名称空间URI匹配):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msg="http://www.caps-solutions.co.uk/webservices/connectors/731/servicerequest/messagetypes"
xmlns:sr="http://www.caps-solutions.co.uk/schema/uniform/731/servicerequest/sr/srtypes"
xmlns:uni="http://www.caps-solutions.co.uk/schema/uniform/72b/common/uniformtypes"
exclude-result-prefixes="msg sr uni"
>
并使用(出于可读性考虑而包装,但是XPath对空格不敏感,您可以将其以相同的方式包装在XSLT中):
/msg:GetGeneralServiceRequestByReferenceValueResponse /sr:GeneralServiceRequest /sr:ServiceRequestIdentification /sr:AlternativeReferences /uni:AlternativeReference[uni:ReferenceType = 'UTRN'] /uni:ReferenceValue
在这里,/uni:AlternativeReference[uni:ReferenceType = 'UTRN']
仅选择那些<AlternativeReference>
子代为所需值的<ReferenceType>
节点。
由于有很多查看XML树的方法(并且因为我认为显式地命名,命名每个步骤都超出了它),所以类似的方法也将起作用:
//uni:ReferenceType[. = 'UTRN']/../uni:ReferenceValue
或
//uni:AlternativeReference[uni:ReferenceType = 'UTRN']/uni:ReferenceValue
答案 1 :(得分:2)
您可以将条件添加到<AlternativeReference>
谓词中,以将<AlternativeReference>
元素的选择限制为具有<ReferenceType>
元素且其值为“ UTRN”的元素:
/*[local-name()='GetGeneralServiceRequestByReferenceValueResponse']/
*[local-name()='GeneralServiceRequest']/
*[local-name()='ServiceRequestIdentification']/
*[local-name()='AlternativeReferences']/
*[local-name()='AlternativeReference' and *[local-name()='ReferenceType' and .='UTRN']]/
*[local-name()='ReferenceValue']
答案 2 :(得分:1)
这应该做:
"//AlternativeReference[1]/ReferenceValue"
或者,如果您知道同级值:
"//ReferenceType[text()='UTRN']/parent::*/ReferenceValue"