XPath для получения выгоды от братьев и сестер с пространством имен - PullRequest
0 голосов
/ 08 октября 2018

У меня есть следующий документ 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 get меня<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 голосов
/ 08 октября 2018

Вы можете добавить критерии к предикату <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'] 
0 голосов
/ 08 октября 2018

Это должно сделать:

"//AlternativeReference[1]/ReferenceValue"

Или, если вы знаете значение брата:

"//ReferenceType[text()='UTRN']/parent::*/ReferenceValue"
0 голосов
/ 08 октября 2018

Не используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...