Xpath - это возможно? Найти узлы, которые имеют значения другого узла, который соответствует значению? - PullRequest
1 голос
/ 16 февраля 2012

Я не знаю, как это объяснить, поэтому, если есть лучший способ, пожалуйста, дайте мне знать.

У меня есть значение, которое мне нужно найти в XML, но я хочу найти другое значение, прежде чем получу набор результатов.

Позвольте мне показать вам:

<n:TaskGetResponse>
    <MemHead>
        <memidnum>1262753194</memidnum>
        <memrecno>22672100</memrecno>
    </MemHead>
    <MemHead>
        <memidnum>1262753194</memidnum>
        <memrecno>22672104</memrecno>
    </MemHead>
    <EntXtsk>
        <caudrecno>6348855</caudrecno>
        <memrecno>22672100</memrecno>
    </EntXtsk>
    <EntXtsk>
        <caudrecno>6348855</caudrecno>
        <memrecno>22672101</memrecno>
    </EntXtsk>
    <EntXtsk>
        <caudrecno>6348878</caudrecno>
        <memrecno>22672102</memrecno>
    </EntXtsk>
    <MemXtsk>
        <caudrecno>6348878</caudrecno>
        <memrecno>22672103</memrecno>
    </MemXtsk>
</n:TaskGetResponse>

У меня есть memidnum 1262753194. Я хочу найти все EntXtsk и MemXtsk, которые имеют memrecno, который соответствует всем MemHead, которые имеют memidnum 1262753194.

В этом примере у меня есть 2 MemHeads, которые имеют одинаковый memidnum, но разные memrecno (есть 2 memrecno для просмотра). Я хочу найти все * Xtsk, которые имеют memrecno, которые соответствуют 2.

Возможно ли это с XPath?

Использование

TaskGetResponse/*[name(.) = 'MemXtsk' or name(.) = 'EntXtsk']

Я могу получить все * Xtsk узлы.

Но не уверен, как получить те, которые связаны только с memidnum-> memrecno, который мне нужен.

Любая помощь будет качаться.

Обновление: Я могу бежать

TaskGetResponse/*[memrecno= //TaskGetResponse/*[memidnum="1262753194"]/memrecno]

И это дает мне все, что с этой комбинацией memrecno. Но я не уверен, как сказать, только получить меня EntXtsk и MemXtsk.

1 Ответ

1 голос
/ 16 февраля 2012

Использовать :

/*/*[self::EntXtsk or self::MemXtsk]
      [memrecno
      =
       /*/MemHead[memidnum = 1262753194]/memrecno
       ]

Выбирает любой элемент с именем EntXtsk или MemXtsk, который является дочерним по отношению к верхнему элементу документа XML и который имеетmemrecno child, строковое значение которого равно строковому значению некоторого элемента memrecno, который является дочерним элементом элемента MemHead, который является дочерним элементом верхнего элемента в документе XML и который также имеет memidnumпотомок, строковое значение которого "1262753194"

XSLT-проверка (я настоятельно рекомендую использовать визуализатор XPath для любого исследования XPath):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <xsl:copy-of select=
   "/*/*[self::EntXtsk or self::MemXtsk]
          [memrecno
          =
           /*/MemHead[memidnum = 1262753194]/memrecno
           ]
   "/>
 </xsl:template>
</xsl:stylesheet>

применительно к этому XML-документу (предоставляется с добавленным еще одним элементом MemXtsk в конце):

<n:TaskGetResponse xmlns:n="n">
    <MemHead>
        <memidnum>1262753194</memidnum>
        <memrecno>22672100</memrecno>
    </MemHead>
    <MemHead>
        <memidnum>1262753194</memidnum>
        <memrecno>22672104</memrecno>
    </MemHead>
    <EntXtsk>
        <caudrecno>6348855</caudrecno>
        <memrecno>22672100</memrecno>
    </EntXtsk>
    <EntXtsk>
        <caudrecno>6348855</caudrecno>
        <memrecno>22672101</memrecno>
    </EntXtsk>
    <EntXtsk>
        <caudrecno>6348878</caudrecno>
        <memrecno>22672102</memrecno>
    </EntXtsk>
    <MemXtsk>
        <caudrecno>6348878</caudrecno>
        <memrecno>22672103</memrecno>
    </MemXtsk>
    <MemXtsk>
        <caudrecno>6348879</caudrecno>
        <memrecno>22672104</memrecno>
    </MemXtsk>
</n:TaskGetResponse>

вычисляет выражение XPath и копирует на выход выбранные узлы :

<EntXtsk xmlns:n="n">
   <caudrecno>6348855</caudrecno>
   <memrecno>22672100</memrecno>
</EntXtsk>
<MemXtsk xmlns:n="n">
   <caudrecno>6348879</caudrecno>
   <memrecno>22672104</memrecno>
</MemXtsk>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...