2017-02-15 15 views
0

Я хочу искать документы, которые не имеют определенного элемента или элемента, не имеющего дочернего узла (даже текстового узла), и элемент должен иметь определенный родительский узел.как искать документы, которые не имеют определенного элемента или имеют нулевое значение в элементе?

, например:

образец XMLs:

<root> 
    <id>123</id> 
    <root2> 
     <number>1234</number> 
    </root2> 
</root> 

<root> 
    <id>123</id> 
    <root2> 
     <issue/> 
     <number>1234</number> 
    </root2> 
</root> 

<root> 
    <id>123</id> 
    <root2> 
     <volume/> 
     <number>1234</number> 
    </root2> 
</root> 

<root-second> 
    <id>123</id> 
    <root2> 
     <volume/> 
     <issue/> 
     <number>1234</number> 
    </root2> 
</root-second> 

<root-second> 
    <id>123</id> 
    <root2> 
     <volume/> 
     <issue/> 
     <number>1234</number> 
    </root2> 
</root-second> 

Новый Docs:

<root> 
    <id>123</id> 
    <root2> 
     <volume>233</volume> 
     <number>1234</number> 
    </root2> 
</root> 
<root> 
    <id>123</id> 
    <root2> 
     <volume>233</volume> 
     <issue>233</issue> 
     <number>1234</number> 
    </root2> 
</root> 
<root> 
    <id>123</id> 
    <root2> 
     <issue>233</issue> 
     <number>1234</number> 
     </root2> 
</root> 

Теперь я хочу, чтобы все XMLs имея <id> в <root> является и <root2> может быть пустым <issue>, <volume> Элемент или элементы (и) вообще отсутствуют.

Как и в вышеуказанном случае, он не должен возвращать xmls с <root-second> как корень.

Он должен вернуть все XMLs с <root> как корень

ответ

1

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

cts:search(
    fn:doc(), 
    cts:element-query(
    xs:QName("root"), 
    cts:element-value-query(xs:QName("id"), "123") 
) 
) 

Я не совсем ясно, на ваш вопрос, но я думаю, вы также можете потребовать, чтобы root2 присутствовал под root, независимо от того, что он может содержать. Если это так, то:

cts:search(
    fn:doc(), 
    cts:element-query(
    xs:QName("root"), 
    cts:and-query((
     cts:element-value-query(xs:QName("id"), "123"), 
     cts:element-query(xs:QName("root2"), cts:true-query()) 
    )) 
) 
) 
+0

David, я обновил свой вопрос. Я добавил новые документы (да, каждый XML находится в собственном документе). Теперь новые добавленные документы не должны входить в результат, так как все три документа имеют , или оба элемента присутствуют с некоторым значением (текстовый узел). Да Дэвид должен представить под , и он должен быть родительским узлом , Как и в моем случае , может присутствовать при , также под (родственный ) –

+0

каратов: истинно-запрос() Я не могу использовать это, поскольку использую ML 7 –

+0

заменить cts: true-query() с помощью cts: and-query (()). –

Смежные вопросы