2016-03-07 2 views
2

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

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

<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> 

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

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

Или что-то подобное, но без для взамен заявление:

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? Обратите внимание, что положение процедуры не может быть жестко запрограммировано. Дубликат ref может повторяться несколько раз и в любом положении. Кроме того, это требование должно выполняться с начальным контекстом <step>.

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

Этот пост был похож, но поиск искал детей, начиная контексте: Xpath Getting All Nodes that Have an Attribute that Matches Another Node

Это было также интересно, но мое значение атрибута не является ID: Xpath: find an element value from a match of id attribute to id anchor

Любые предложения?

+0

Я должен добавить, что я нашел много сообщений, которые затрагивали эти вопросы с помощью XSLT (и других языков) или XPath 2.0, но не отвечал на это исключительно с XPath 1.0. Благодаря! –

+2

Вам не повезло. Это невозможно сделать в XPath 1.0, потому что внутри предиката нет способа ссылаться на другой узел, чем тот, к которому принадлежит предикат. Это самая проблема 'current()' и переменные решаются в XSLT, в конце концов. – Tomalak

+0

Спасибо, @Tomalak, за подтверждение того, что я уже подозревал. –

ответ

0

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