2015-10-18 3 views
3

в схеме xml-схемы в < Элемент > s разрешен без ограничений, например. в неупорядоченном списке элементов (<randlist> для случайного списка). Эти элементы могут содержать подпункты, которые могут быть подстроены с использованием <, пункт > в качестве подэлемента в другом элементе списка, таком как <randlist> или <seqlist> для упорядоченных списков.Выражение для подсчета вложенности элементов с использованием xpath

Теперь я хочу определить вложенность более трех уровней глубины вложенности в документе, чтобы применить к нему некоторые ограничения. Использование XPath это то, что должно быть разрешено безусловным:

randlist // элемент

или

randlist // элемент // элемент

или

randlist // элемент // элемент // статья

но

randlists with более 3 уровней глубины гнездования должны быть запрещены, например.

randlist // элемент // элемент // элемент // элемент

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

заблаговременно заблаговременно

жаль людей! так вот пример идет

<randlist> <!-- first level (not nested at all): allowed --> 
    <item> 
     This is the first item of an unordered enumeration of items that are prosa altogether. 
    </item> 
    <item> 
     <randlist> <!-- second level (nested): allowed --> 
      <item> 
       This is the first item of an unordered enumeration of items that are prosa altogether. 
      </item> 
      <item> 
       Another item with some information in the nested unordered list. 
      </item> 
      <item> 
       <seqlist> <!-- third level (double nested): allowed --> 
        <item> 
         This is the first item of an ordered enumeration of items (it may be shown with the number 1). 
        </item> 
        <item> 
         This is the second item of an ordered enumeration of items (it may be shown with the number 2). 
         <randlist> <!-- fourth level (triple nested): should be prohibited --> 
          <item> 
           This is the first item of an unordered enumeration of items. 
          </item> 
          <item> 
           This is the second item of an unordered enumeration of items. 
          </item> 
         </randlist> 
        </item> 
        <item> 
         This is the third item of an ordered enumeration of items (it may be shown with the number 3). 
        </item> 
       </seqlist> 
      </item> 
     </randlist> 
    </item> 
</randlist> 

мне нужно обнаружить более 3 уровней списков элементов, то есть четвертый уровень и многого другого. Мне нужно что-то вроде, например. randlist [count (nesting (item))> 3], если в xpath существует функция типа «вложенность».

+0

Вы можете показать пример XML и добавить то, что хотите получить? –

+0

Согласен, можете ли вы дать нам образец XML? – gtlambert

+0

У вас есть пример как «Ответ», но, конечно, на него нет ответа :) – IlkerS

ответ

2

что случилось с выражением, что вы предоставили себя:

randlist//item//item//item//item 

Это выберет любой предмет, у которого есть три или более предков.

Более эффективным может быть

randlist//item[count(ancestor::item) > 2] 

но это зависит от процессора XPath вы используете.

+0

oh, похоже, это выражение, которое я искал для элемента [count (ancestor :: item)> 2]. спасибо, я попробую – IlkerS

+0

, и когда я подумаю: вы правы! выражение с четырьмя элементами также обнаружит вложенности с пятью или более элементами элемента. Я относительно новичок в xpath, поэтому мне иногда нужно мое время :) – IlkerS

1

С вашего вопроса немного сложно узнать точно Какой у вас желаемый результат, но я думаю, что одного из следующих предложений должно быть достаточно или помочь вам достичь своей цели.

В качестве общего примера вы можете подсчитать количество элементов, прошедших определенный уровень вложенности, передав набор узлов/элементов в функцию XPath count. Например:

XML

<randlist> 
    <item> 
     <content>Example Content</content> 
     <subitem> 
      <p>Content</p> 
      <p2>More Content</p2> 
     </subitem> 
    </item> 
</randlist> 

XPath

count(randlist/item//*) 

Это будет подсчитывать количество элементов, которые являются потомками элементов элементов, которые являются прямыми потомками randlist элементов. Двойной слэш // означает, что XPath ищет потомков, а оператор * - это подстановочный знак, который соответствует любым элементам, независимо от имени элемента.Поэтому он вернется - beacuse есть 4 элемента: content, subitem, p и p2.

В вашем случае, я думаю, что вы ищете, чтобы обнаружить randlist и seqlist элементов, которые находятся в пределах трех уровней вложенности item. Если вы хотите, чтобы обнаружить это явление, вы можете использовать:

count(randlist//item//item//item//randlist|randlist//item//item//item//seqlist) 

Оператор | вычисляет объединение двух множеств. Если вы хотите, чтобы обнаружить возникновение любого элемента, расположенного в пределах трех уровней вложенности item, опять же, вы должны использовать оператор подстановки *:

count(randlist//item//item//item//*) 
+0

благодарим за ответ! проблема в том, что я хочу обнаружить более 3 уровней гнездования. поэтому это не номер исправления. Я думаю, что я проверю что-то вроде randlist // item [count (ancestor :: item)> 3] как предложено ниже, как только я нахожусь в офисе и снова работаю с XmlSpy :) – IlkerS

1

Если предположить, что randlist всегда корневой элемент документа XML , это один из возможного выражения XPath, чтобы проверить, если он содержит более 3 уровень вложенных item элементов:

randlist[.//item[count(ancestor::item)>=3]] 
+0

okay аналогичный ответ Michael Кей также добавил. Благодарю вас всех за ваши хорошие идеи. – IlkerS