предшествующий брат текущего текстового узла - PullRequest
1 голос
/ 04 августа 2011

У меня есть такой вид 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'

Спасибо в

Ромны

Ответы [ 2 ]

1 голос
/ 04 августа 2011

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

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

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

0 голосов
/ 04 августа 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"]])
...