2013-02-18 5 views
0

У меня есть структуру XML, которая выглядит следующим образом:XPath: подсчитывать предшествующие элементы

<document> 
    <body> 
     <section> 
      <title>something</title> 
      <subtitle>Something again</subtitle> 
      <section> 
       <p xml:id="1234">Some text</p> 
       <figure id="2121"></figure> 
       <section> 
        <p xml:id="somethingagain">Some text</p> 
        <figure id="939393"></figure> 
        <p xml:id="countelement"></p> 
       </section> 
      </section> 
     </section> 
     <section> 
      <title>something2</title> 
      <subtitle>Something again2</subtitle> 
      <section> 
       <p xml:id="12345678">Some text2</p> 
       <figure id="939394"></figure> 
       <p xml:id="countelement2"></p> 
      </section> 
     </section> 
    </body> 
</document> 

Как я могу рассчитывать на рисунке elemtens Передо в <p xml:id="countelement"></p> элемента с помощью XPath?

Редактировать: И я хочу только подсчитать элементы фигуры в родительском разделе, в следующем разделе он должен начинаться с 0 снова.

+0

Не могли бы вы проверить свое форматирование? Имя элемента не отображается. –

+0

Ах, извините. Я изменил его сейчас :) – user2075124

+0

Каков ожидаемый результат для этого входа? Должны ли быть два результата или только один (второй называется 'countelement2'). Результат для первого 'countelement' равен 1 или 2? Второй не является «в родительском разделе». Какой движок XPath вы используете (и поддерживает ли он XPath 2.0)? –

ответ

0

count(id("countelement")/preceding-sibling::figure)

Пожалуйста, обратите внимание, что xml:id атрибуты двух различных элементов может не то же самое значение, таких как «countelement». Если вы хотите, чтобы два разных элемента имели одинаковый атрибут с одним и тем же значением «countelement», он должен быть каким-то другим атрибутом, возможно, «добрым», который не является идентификатором типа атрибута DTD. В этом случае вместо id("countelement") вы должны использовать *[@kind="countelement"].

1

Учитывая, что используется совместимый двигательXPath 2.0, найти кол-элемент и вызвать fn:count() для каждого из них с использованием всех предыдущих фигурное элементов в качестве входных данных.

Это возвращает количество цифр, предшествующих каждому «countelement» на том же уровне (я предполагаю, что это то, что вы на самом деле хотите):

//p[@xml:id="countelement"]/count(preceding-sibling::figure) 

Это возвращает количество цифр, предшествующих каждому «countelement» и уровень выше:

//p[@xml:id="countelement"]/count(preceding-sibling::figure | parent::*/preceding-sibling::figure) 

Это возвратит число всех предшествующих фигур предшествующего каждый «countelement» и уровень выше:

//p[@xml:id="countelement"]/count(preceding::figure) 

Если вы связаны с XPath 1.0, вы не сможете получить несколько результатов. Если @id действительно идентификатор (и, таким образом, уникальный), вы будете иметь возможность использовать этот запрос:

count(//p[@xml:id="countelement"]/preceding::figure) 

Если есть «countelements», которые не являются <p/> элементы, заменить p на *.

+0

Ваш второй пример почти работает. Тем не менее, он не «останавливает» подсчет - я хочу только подсчитывать объекты в текущем разделе уровня 1. – user2075124

+0

Кажется, я все еще не понимаю, какие цифры считать. Не могли бы вы дать мне цифру 'id' для каждого элемента счета? –

+0

Я хочу подсчитать, сколько цифр есть в первом элементе раздела. И позже, сколько элементов рисунка находится внутри элемента секции уровня 2. – user2075124

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