Выражение XPath для перехода к следующему полю <relatedfile> - PullRequest
1 голос
/ 10 октября 2011

Я пытаюсь прочитать файл, настроенный следующим образом:

<file>
  <name>My name</name>
  <size>My size</size>
  <relatedfiles>
    <relatedfile>My related file 1</relatedfile>
    <relatedfile>My related file 2</relatedfile>
    <relatedfile>My related file 3</relatedfile>
  </relatedfiles>
</file>

Чтобы получить поля имени / размера, я использую выражение XPath

"file/name"

и

 "/size"

, который работал до сих пор.

Теперь я хочу прочитать связанные файлы, по одному связанному файлу за раз. Я посмотрел на получение первого как

/relatedfiles/relatedfile

, который возвращает меня к первому связанному файлу, но я не знаю, как перейти к следующему отдельному файлу (я видел примеры, включающие в себя «последующий брат», но в учебниках говорится, что он возвращает ВСЕХ братьев и сестер, и я хочу только работать по одному) ...

Спасибо.

Ответы [ 4 ]

1 голос
/ 10 октября 2011

/ relatedfiles / relatedfile [] получит вам определенные узлы. Обратите внимание, что XPath индексирует от 1.

EDIT

Хорошо, я должен был поймать это, и мне жаль, что я опубликовал то, что я сделал выше.

Правильный путь должен был // relatedfiles / relatedfile []

То есть, независимо от контекста, просмотрите все узлы и найдите все, что начинается с связанных файлов, найдите связанный файл подузлов, найдите мне индексированный элемент.

Вы могли бы также легко написать это как // relatedfiles []

0 голосов
/ 11 октября 2011

// relatedfiles / relatedfile вернет все три.Вы можете перебирать или выбирать, фильтруя для определенного индекса, который вас интересует: // relatedfiles / relatedfile [n]

для цикла, вы можете сделать что-то вроде

<xsl:for-each select="//relatedfiles/relatedfile">
   <xsl:value-of select="."/>
</xsl:for-each>
0 голосов
/ 11 октября 2011

Если у вас есть XPath someExpr, который выбирает нужный элемент и вы хотите выбрать следующий брат такой элемент, используйте:

someExpr/following-sibling::myElementName[1]
0 голосов
/ 10 октября 2011

Если вы используете XQuery (из которых XPath является подмножеством), файловый модуль EXPath позволяет выполнять итерации с предложением for и выполнять операции с каждым отдельным файлом, например:

for $file in doc("file.xml")//relatedfile
where f:exists($file)
return f:read-text($file)

Thisвозвращает последовательность строк, каждая из которых содержит содержимое файла среди существующих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...