2014-02-05 3 views
0

Мне нужно создать XPath, чтобы получить значение элемента LMS/LMS.1/LMS.1.1, но иногда подэлемент LMS.1.1 не существует и текст находится в родительском элементе LMS.1.XPath выбор родительского или дочернего элемента

Input Case 1:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <LMS> 
     <LMS.1> 
      <LMS.1.1>content1</LMS.1.1> 
      <LMS.1.2>shouldNotBeSelected</LMS.1.2> 
     </LMS.1> 
    </LMS>  
</root> 

Input Case 2:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <LMS> 
     <LMS.1>content2</LMS.1> 
     <LMS.2>shouldNotBeSelected</LMS.2> 
    </LMS>  
</root> 

Как я должен создать XPath, что он является универсальным и может обрабатывать оба случая с одним XPath?

т.е. //LMS.1/text() действительно возвращается только вернуть Content2

Или другой подход: Выберите родительский текст, если данный лист элемент не существует: //LMS.1/LMS1.1 также вернуть Content1.

ответ

0

Вы можете получить текстовое содержимое всего поддерева, запросивего самого верхнего узла - предположительно элемент <LMS.1> в этом случае. Однако это будет также включать пробелы, которые, как я предполагаю, вам понадобятся снять.

So: normalize-space(/root/LMS/LMS.1) должно быть близко к тому, что вы ищете.

0

Это выражение

//LMS/descendant::*[not(*)]/text() 

выбирает текстовый узел листового узла любого суб дерева LMS

+0

Но это выбирает все элементы text() внутри LMS. Могут быть и другие элементы – FiveO

0

DoES ниже кода поможет вам немного?

concat(//LMS.1/LMS.1.1/text(), //LMS.1/text()) 
0

С следующим выберите содержащий или операнд это возможно:

//LMS.1/LMS.1.1|//LMS.1[not(*)] 

Но это не очень красиво, но работает до сих пор. Любые другие решения?

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