Я нашел много похожих сообщений по этому вопросу, но ничего не ответил на этот конкретный вопрос. Я должен использовать 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
Любые предложения?
Я должен добавить, что я нашел много сообщений, которые затрагивали эти вопросы с помощью XSLT (и других языков) или XPath 2.0, но не отвечал на это исключительно с XPath 1.0. Благодаря! –
Вам не повезло. Это невозможно сделать в XPath 1.0, потому что внутри предиката нет способа ссылаться на другой узел, чем тот, к которому принадлежит предикат. Это самая проблема 'current()' и переменные решаются в XSLT, в конце концов. – Tomalak
Спасибо, @Tomalak, за подтверждение того, что я уже подозревал. –