我有以下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>为“ UTRN”的<ReferenceType>

以下xpath是我最后一个<ReferenceValue>引用的<Alternative>

/*[local-name()='GetGeneralServiceRequestByReferenceValueResponse']/*[local-name()='GeneralServiceRequest']/*[local-name()='ServiceRequestIdentification']/*[local-name()='AlternativeReferences']/*[local-name()='AlternativeReference']/*[local-name()='ReferenceValue']


我尝试将[]用于父AlternativeReference节点,然后使用ReferenceValue ='UTRN',但无法获得所需的输出。

最佳答案

不要使用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:替代参考
/ uni:AlternativeReference [uni:ReferenceType ='UTRN']
/ uni:参考值


在这里,/uni:AlternativeReference[uni:ReferenceType = 'UTRN']仅选择那些<AlternativeReference>子代为所需值的<ReferenceType>节点。



由于查看XML树的方法有很多(而且我认为显式地命名,命名每个步骤都超出了它),所以类似的方法也可以工作:

// uni:ReferenceType [。 ='UTRN'] /../ uni:ReferenceValue


要么

// uni:AlternativeReference [uni:ReferenceType ='UTRN'] / uni:ReferenceValue

10-07 17:42