Как определить, есть ли текст на узле с помощью xpath/schematron

Я ищу способ написать тест xpath/schematron для идентификации конкретного узла каждый раз, когда он содержит какое-либо небелое пространство, развернутый текст в любом месте непосредственно внутри узла (имеется в виду, возможно, среди, но не в дочернем элементе) . Итак, если мой xml выглядит так:

<root>
...
 <node>
     <arbitraryChild/>
     Find me
     <arbitraryChild>Don't find me</arbitraryChild>
     more text
 </node>
 ...
 <node>
     <arbitraryChild/> <arbitraryChild/>
     <arbitraryChild>Don't find me</arbitraryChild>
 </someNode>
...
</node>    

Он идентифицирует первый экземпляр somenode, но не второй. Я пробовал каждую вариацию contains(...), text() и test="...", которую я могу придумать, но очевидно, что я подхожу к этому не с той стороны.


person wolfmason    schedule 14.07.2015    source источник
comment
Кажется, это работает test="normalize-space(text()[1])" Мой синтаксический анализатор жалуется и дает сбой каждый раз, когда я использую text(), и он попадает в узел с текстом с дочерними элементами, перемежающимися в середине строки (он говорит мне, что последовательность из более чем одного узла не разрешена, так как первый аргумент...). Таким образом, просто пройдясь по первому текстовому узлу, я могу определенно сказать, что в узле есть текст. Тем не менее, это кажется глупым. Должен быть лучший подход...   -  person wolfmason    schedule 15.07.2015
comment
Можете ли вы уточнить? Есть ли ошибка в xml? Очевидно, это пустой узел, но он нужен только для того, чтобы показать, что перед текстом может быть элемент. Возможно, даже пустой. [изменить: предполагаемый получатель удалил комментарий, но информация может быть актуальной.]   -  person wolfmason    schedule 15.07.2015


Ответы (2)


Я думаю, это просто

node[text()[normalize-space()]]

Я не думаю, что «и *» в ответе @har07 относится к какому-либо требованию, указанному в вашем вопросе: вы не сказали, что должен быть хотя бы один дочерний элемент, только что должен быть (непустой ) текст.

person Michael Kay    schedule 15.07.2015
comment
Это работает! Моя ошибка была в попытке text() and normalize-space(). - person wolfmason; 15.07.2015

Вы можете попробовать следующее выражение XPath для проверки:

test="text()[normalize-space()] and *"

При заданном элементе контекста приведенное выше выражение проверяет, имеет ли текущий элемент контекста непустой текстовый узел (узлы) дочернего элемента, а также дочерний элемент (элементы).

Я не знаком с schematron, но выражение работает в XPath (например, используется в предикате XPath) и XSLT, так что стоит попробовать.

person har07    schedule 15.07.2015