XPath pour obtenir de la valeur auprès des frères et sœurs avec un espace de noms


Rob Bowman

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.

Tomalak

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

Articles connexes


XPath :: Obtenir le suivi des frères et sœurs

ajouter des points-virgules J'ai la structure HTML suivante: J'essaie de créer une méthode robuste pour extraire le deuxième élément de résumé de couleur car il y aura beaucoup de ces balises dans le DOM. <table> <tbody> <tr bgcolor="#AAAAAA"> <tr>

Trouver la valeur des enfants frères et sœurs

Umerm J'essaye de trouver la valeur de span. Lorsque je clique sur l'ancre, cela devrait me donner une valeur à l'intérieur de la travée. Il doit être dynamique, voici le html <div class="member-info"> <h2>Total Votes : <span>1</span></h2> <a href="3