XPath pour obtenir de la valeur auprès des frères et sœurs avec un espace de noms
J'ai le doc xml suivant:
<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>
Je dois sélectionner celui <ReferenceValue>
qui a un frère ou une sœur <ReferenceType>
"UTRN"
Le xpath suivant me donne <ReferenceValue>
la dernière <Alternative>
référence.
/*[local-name()='GetGeneralServiceRequestByReferenceValueResponse']/*[local-name()='GeneralServiceRequest']/*[local-name()='ServiceRequestIdentification']/*[local-name()='AlternativeReferences']/*[local-name()='AlternativeReference']/*[local-name()='ReferenceValue']
J'ai essayé d'utiliser [] pour le nœud AlternativeReference parent puis ReferenceValue = 'UTRN' mais je n'ai pas pu obtenir la sortie requise.
N'utilisez pas local-name()
. Déclarez les espaces de noms dans votre XSLT et utilisez les préfixes.
Par exemple, déclarez-les comme ceci (vous pouvez choisir les préfixes de votre choix, tant que les URI de l'espace de noms correspondent):
<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"
>
Et utilisez (enveloppé pour la lisibilité, mais XPath n'est pas sensible aux espaces, vous pouvez l'envelopper de la même manière dans votre XSLT):
/ msg: GetGeneralServiceRequestByReferenceValueResponse / sr: GeneralServiceRequest / sr: ServiceRequestIdentification / sr: AlternativeReferences / uni: AlternativeReference [uni: ReferenceType = 'UTRN'] / uni: ReferenceValue
Ici, /uni:AlternativeReference[uni:ReferenceType = 'UTRN']
ne sélectionne que les <AlternativeReference>
nœuds qui ont un <ReferenceType>
enfant de la valeur souhaitée.
Puisqu'il existe de nombreuses façons de regarder une arborescence XML (et parce que je pense que. Nommer. Explicitement. Chaque. Étape. Le. Chemin. Revient à en faire trop), quelque chose comme ça fonctionnerait également:
// uni: ReferenceType [. = 'UTRN'] /../ uni: ReferenceValue
ou
// uni: AlternativeReference [uni: ReferenceType = 'UTRN'] / uni: ReferenceValue