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

У меня есть такой XML:

<nav:objectList>
    <nav:item >
      <nav:attribute name="display">1</nav:attribute> 
      <nav:attribute name="className">document.Document</nav:attribute> 
      <nav:attribute name="title">item 1</nav:attribute> 
      <nav:attribute name="getFileExtension">pdf</nav:attribute> 
    </nav:item>
    <nav:item >
      <nav:attribute name="display">2</nav:attribute> 
      <nav:attribute name="className">video.Video</nav:attribute> 
      <nav:attribute name="title">item 2</nav:attribute> 
      <nav:attribute name="getFileExtension">mp4</nav:attribute> 
    </nav:item>
    <nav:item >
      <nav:attribute name="display">3</nav:attribute> 
      <nav:attribute name="className">document.Document</nav:attribute> 
      <nav:attribute name="title">item 3</nav:attribute> 
      <nav:attribute name="getFileExtension">pdf</nav:attribute> 
    </nav:item>
    <nav:item >
      <nav:attribute name="display">4</nav:attribute> 
      <nav:attribute name="className">video.Video</nav:attribute> 
      <nav:attribute name="title">item 4</nav:attribute> 
      <nav:attribute name="getFileExtension">mp4</nav:attribute> 
    </nav:item>
    <nav:item >
      <nav:attribute name="display">5</nav:attribute> 
      <nav:attribute name="className">document.Document</nav:attribute> 
      <nav:attribute name="title">item 5</nav:attribute> 
      <nav:attribute name="getFileExtension">pdf</nav:attribute> 
    </nav:item>
</nav:objectList>

Я хочу подсчитать все document.Document, предшествующие текущему document.Document. (Я не хочу считать видео. Видео) Например, если я нахожусь на 5, я хочу вернуть 2, а не 4.

Это похоже на сообщение: XSLT - сравнение элементов предыдущего брата с элемент текущего узла

На самом деле я пытался (много вещей), например:

count(preceding-sibling::nav:attribute[@name='type.className']='com.arsdigita.cms.document.Document'

Спасибо

Роман


person Campourcy    schedule 04.08.2011    source источник
comment
@LarsH: Вы правы, мне нужно полное имя com.arsdigita.cms.document.Document), я упростил XML. Спасибо вам обоим !! Ваши два ответа интересны, я попробую в следующий понедельник (я не могу проверить это раньше) и скажу вам, какой из них   -  person    schedule 08.08.2011


Ответы (2)


Измените preceding-sibling на preceding, потому что атрибуты, которые вы пытаетесь подсчитать, не являются одноуровневыми узлами, от которых вы пытаетесь подсчитать (у них разные родители). Также вам нужно сделать полное предложение из части = 'document.Document':

count(preceding::nav:attribute[@name='type.className'
                               and . = 'document.Document'])

(или, может быть, вы хотите, чтобы там было полное 'com.arsdigita.cms.document.Document'?)

person LarsH    schedule 04.08.2011

Я не знаком с xslt, но много использую xpath. Это дает последовательность nav:item элементов с document.Document потомками:

//nav:item[nav:attribute[@name="className" and text()="document.Document"]]

И этот запуск одного из этих nav:item элементов покажет вам, сколько похожих элементов ему предшествует:

count(preceding-sibling::nav:item[nav:attribute[@name="className" and text()="document.Document"]])
person MattH    schedule 04.08.2011