XPath通过命名空间从同级中获取价值

时间:2018-10-08 16:20:14

标签: xslt xpath

我有以下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',但无法获得所需的输出。

3 个答案:

答案 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"