Как определить N-й узел чего-то, чем я сейчас пользуюсь при использовании XPATh - PullRequest
3 голосов
/ 09 декабря 2011

Хорошо.У меня есть атрибут в XML-документе, который, как я знаю, будет встречаться более одного раза.Используя C #, я перебираю все узлы, которые имеют этот атрибут.Я знаю, как подсчитать вхождение элемента, используя xpath ...

count("//x/y@b")

и т. Д.
Но есть ли способ, которым я могу получить n-ное значение узла, который яя нахожусь на ... например

<?xml version="1.0"?>
<x>
   <y/>
   <y/>
   <y/>
</x>

Допустим, я программно проходил через это с помощью c #.И скажем, я был на втором элементе.Есть ли способ использовать xpath, чтобы я мог выяснить, что я на 2-м узле?Я думаю, я просто пытаюсь найти свою позицию в итерации.Есть идеи?В настоящее время прочесываю интернет.Если я это выясню, я обязательно сообщу вам.

Спасибо.

ОБНОВЛЕНИЕ: НЕ ВИДЕТ, чтобы мои вещи заработали Хорошо.Я думал, что обновлю свой вопрос.Кажется, я не могу заставить ваши предложения работать ...

<Template>
 <TemplateData>
  <ACOData>
   <POPULATION_PATIENT_ID>6161</POPULATION_PATIENT_ID>
   <PATIENT_ID>4329</PATIENT_ID>
  </ACOData>
  <ACOData>
   <POPULATION_PATIENT_ID>5561</POPULATION_PATIENT_ID>
   <PATIENT_ID>4327</PATIENT_ID>
  </ACOData>
  <ACOData>
   <POPULATION_PATIENT_ID>6160</POPULATION_PATIENT_ID>
   <PATIENT_ID>4321</PATIENT_ID>
  </ACOData>
  <ACOData>
   <POPULATION_PATIENT_ID>5561</POPULATION_PATIENT_ID>
   <PATIENT_ID>4320</PATIENT_ID>
  </ACOData>

Это XML, который я использую.Но я не могу получить правильный счет.Я всегда получаю ноль?

encounter = Int32.Parse((patElm.CreateNavigator().Evaluate("count(/Template/TemplateData/ACOData/POPULATION_PATIENT_ID[.='" + populationPatID + "']/preceding-sibling::ACOData/POPULATION_PATIENT_ID[.='"+populationPatID+"'])")).ToString());

Выше приведен код, который я пытаюсь использовать для получения правильного значения ... Обратите внимание на мою функцию подсчета

count(/Template/TemplateData/ACOData/POPULATION_PATIENT_ID[.='" + populationPatID + "']/preceding-sibling::ACOData/POPULATION_PATIENT_ID[.='"+populationPatID+"'])"

Ответы [ 3 ]

3 голосов
/ 09 декабря 2011

Чтобы получить второй такой элемент в документе, используйте:

(//x/y[@b])[2]

Предположим, вы хотите пойти другим путем.То есть у вас есть один из этих узлов, и вы хотите знать его общее положение.Как правило, для любого выражения <expr> верно следующее:

$n = count((<expr>)[$n]/preceding::*[count(.|<expr>)=count(<expr>)])

То есть положение N-го элемента, выбранного с помощью <expr>, можно найти путем подсчета всех предыдущих элементов, также выбранных этимвыражение.Используя аналогичные методы, мы можем найти положение некоторого узла, который будет выбран более общим выражением, в пределах набора всех узлов, выбранных этим выражением.

Например, предположим, что мыиметь следующий документ:

<x>
    <y b="true"/>
    <y b="true"/>
    <y/>
    <y/>
    <x><y b="true"/><y/><y b="true">77</y></x>
    <y/>
    <y/>
</x>

И мы хотим знать позицию в документе узла в /*/*/y[.='77'] среди всех узлов, выбранных //x/y[@b].Затем используйте следующее выражение:

count(/*/*/y[.='77']/preceding::*[count(.|//x/y[@b])=count(//x/y[@b])]) + 1

Более конкретное разовое решение выглядит следующим образом:

count(/*/*/y[.='77']/preceding::y[parent::x and @b]) + 1

Результат (в обоих случаях):

4

Примечание: Предполагается, что /*/*/y[.='77'] и (<expr>)[$n] выше фактически выбирают какой-либо узел в документе.Если нет, результат будет ошибочным 1 из-за добавления 1 к результату подсчета.По этой причине этот метод, вероятно, наиболее полезен при работе с контекстным узлом или когда гарантируется, что ваше начальное выражение выбирает узел.(Конечно, можно также использовать начальную проверку ошибок.)

1 голос
/ 09 декабря 2011

Допустим, я прогонял это программно, используя c #.И скажем, я был на втором элементе.Можно ли с помощью xpath выяснить, что я нахожусь на втором узле?

Предположим, как вы говорите, текущий (начальный контекст) узел равен /x/y[2], и вы хотитепосмотрите, какова его «позиция».

Оцените это выражение XPath (вне текущего узла):

count(preceding-sibling::y) + 1
0 голосов
/ 09 декабря 2011

Вы можете использовать функцию position

x/y[position() = 3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...