Я нашел много похожих сообщений на этот вопрос, но ничего, что отвечало бы на этот конкретный вопрос. Я должен использовать 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
Какие-либо предложения?
current()
и переменные решают в XSLT. - person Tomalak   schedule 07.03.2016