2015-12-10 3 views
0

Мой xml выглядит следующим образом. Фокус находится на третьем уровне: <name>, <address> и т. Д. Я хотел бы найти позицию родителя <customer>.xPath, чтобы получить позицию родительского узла, используя счет

Я использую «count(../preceding-sibling::*) + 1», но он не возвращает счет, когда узел пуст. Как это исправить? Благодарю.

<record> 
    <customer> 
     <name>Sue A</name>     -- return 1 
     <address>123 Main St</address>  -- return 1 
     <phone></phone>      -- missing 
     <status>A</status>     -- return 1 
    </customer> 
    <customer> 
     <name>John B</name>     -- return 2 
     <address></address>     -- missing 
     <phone>123-456-7890</phone>   -- return 2 
     <status></status>     -- missing 
    </customer> 
    … 
</record> 
+1

Просьба указать [mcve], который демонстрирует проблему. Вы отказались от того, как вы устанавливаете текущий узел при оценке вашего XPath. – kjhughes

ответ

0

Пока вопрос не хватает много информации, используя следующую XQuery Это выглядит как ваша логика верна, однако, вы, вероятно, используете текстовые узлы в текущих узлах вместо узла элемента.

Этот запрос возвращает те же неправильные результаты, потому что некоторые текстовые узлы отсутствуют:

let $x := 
    for $grandchild in //customer/*/text() 
    return count($grandchild/../../preceding-sibling::*) + 1 
return $x 

Этот запрос возвращает правильные результаты, потому что каждый элемент существует:

let $x := 
    for $child in //customer/* 
    return count($child/../preceding-sibling::*) + 1 
return $x 

Выбор узла элемента, как ток узел, вероятно, исправит любую проблему.

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