XPath 1.0: используйте значение атрибута родителя текущего узла, чтобы найти другой соответствующий узел.

Я нашел много похожих сообщений на этот вопрос, но ничего, что отвечало бы на этот конкретный вопрос. Я должен использовать XPath 1.0. У меня нет XSLT (или XQuery, или чего-то еще), и я не могу использовать XPath 2.0. Я выполняю этот XPath из части программного обеспечения (Arbortext Styler), в котором я могу использовать XPath 1.0 для выбора контента из других узлов, но XSLT недоступен в этом контексте. Кроме того, я не могу контролировать структуру исходного XML.

Когда я нахожусь в контексте <step>, мне нужно иметь возможность сопоставить предыдущую процедуру/задачу/шаг, для которых родительская процедура этого шага соответствует @ref и @seq текущей процедуры и имеет букву «A» в качестве значения для @ конф.

<document>
  <topic>
    <procedure ref="056" seq="01" conf="A">
      <task>
        <step>1. Blah Blah (056-01-A)</step>
      </task>
    </procedure>
    <procedure ref="057" seq="02" conf="A">
      <task>
        <step>2. Blah blah (057-02-A)</step>
      </task>
    </procedure>
    <procedure ref="057" seq="02" conf="B">
        <task>
            <step>2. Blah blah (057-02-B)</step>
        </task>
    </procedure>
    <procedure ref="057" seq="03" conf="A">
        <task>
            <step>3. Blah blah (057-02-A)</step>
        </task>
    </procedure>
  </topic>
</document>

Мне нужно что-то вроде этого, но без функции current(), которая не поддерживается программным приложением:

//procedure[@ref=current()/ancestor::procedure/@ref and @seq=current()/ancestor::procedure/@seq and @conf='A']/task/step

Или что-то вроде этого, но без оператора for in return:

for $ref in ancestor::procedure/@ref, $seq in ancestor::procedure/@seq return //topic/procedure[@ref=$ref and @seq=$seq and @conf='A']/task/step/text()

Есть ли у кого-нибудь предложения о том, как это можно сделать исключительно с помощью XPath 1.0? Обратите внимание, что положение процедуры не может быть жестко закодировано. Повторяющиеся ссылки могут встречаться несколько раз и в любой позиции. Кроме того, требуется, чтобы это сопоставление выполнялось с начальным контекстом <step>.

Я подозреваю, что ответ на мой вопрос заключается в том, что это невозможно сделать, но я знаю, что если это можно сделать, это место, где можно найти ответ! Заранее спасибо всем, кто задумается над этим вопросом.

Этот пост был похож, но поиск искал дочерние элементы начального контекста: Xpath Получение всех узлов, имеющих атрибут, совпадающий с другим узлом

Это тоже было интересно, но значение моего атрибута не является идентификатором: Xpath: найти значение элемента по совпадению атрибута id с привязкой id

Какие-либо предложения?


person T. Carano    schedule 07.03.2016    source источник
comment
Я должен добавить, что я нашел много сообщений, в которых эти вопросы рассматривались с помощью XSLT (И других языков) или XPath 2.0, но не отвечали на них исключительно с помощью XPath 1.0. Спасибо!   -  person T. Carano    schedule 07.03.2016
comment
Вам не повезло. Это невозможно сделать в XPath 1.0, потому что внутри предиката нет возможности сослаться на другой узел, кроме того, которому принадлежит предикат. В конце концов, это та самая проблема, которую current() и переменные решают в XSLT.   -  person Tomalak    schedule 07.03.2016
comment
Спасибо, @Tomalak, за подтверждение того, что я уже подозревал.   -  person T. Carano    schedule 07.03.2016
comment
Оставьте его открытым еще на некоторое время и дождитесь второго подтверждения того, что мы действительно правы.   -  person Tomalak    schedule 07.03.2016
comment
Прежде чем я попытаюсь сделать все возможное, мне нужно некоторое разъяснение, пожалуйста. Если вам нужно сопоставить предыдущую процедуру/задачу/шаг, для которых родительская процедура этого шага соответствует @ref и @seq текущей процедуры и имеет буква A в качестве значения для @conf, боюсь, вы заблудились в начале, потому что в примере нет двух таких процедур. Я что-то упустил здесь?   -  person Honza Hejzl    schedule 14.03.2016
comment
не совсем та же проблема, но я также застрял с отсутствием current() в xpath. stackoverflow.com/questions/42335600/   -  person 1000i100    schedule 20.02.2017


Ответы (1)


Как предложили Томалак и Хонза Хейзл, это невозможно сделать с помощью XPath 1.0. Спасибо за ответ.

person T. Carano    schedule 08.04.2016