XSLT 1.0: сортировка между несколькими документами - PullRequest
0 голосов
/ 19 июня 2009
<xsl:for-each select="//filenames">
   <xsl:variable name="current_filename" select="."/>
   <xsl:for-each select="
     document(.)//someNode[not(
       . = document($current_filename/preceding-sibling::node())//someNode
     )]
   ">
      <xsl:value-of select="."/>
   </xsl:for-each>
</xsl:for-each>

В приведенном выше коде (XSLT 1.0) у меня есть ряд документов (//filenames), которые я хочу открыть и выбрать некоторые узлы, если только значение этого узла не равно значению одного и того же узла во всех предыдущих документах ,

Чтобы это сработало, мне пришлось вложить два цикла for-each, потому что мне нужно сохранить имя текущего документа в переменной, чтобы выбрать его предшествующего брата ($current_filename/preceding-sibling).

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

Кто-нибудь знает способ достижения этой сортировки в любом случае? Может быть, способ избежать необходимости использования переменной и, следовательно, вложенности циклов for-each?

Ответы [ 3 ]

1 голос
/ 19 июня 2009

Единственный способ сделать это за один шаг - сохранить все узлы в переменной и преобразовать ее в набор узлов с помощью функции расширения node-set(). Объединенный набор узлов затем может быть отсортирован в обычном режиме.

Если по какой-то причине вы не можете использовать функцию node-set(), вы можете разбить операцию только на два отдельных этапа преобразования: 1) выходные узлы, не отсортированные во временном документе, 2) преобразование временного документа в желаемый вывод.

0 голосов
/ 19 июня 2009

Я узнал, как это сделать!

Сначала просто выбрав все узлы и отсортировав их, я смог отфильтровать узлы, с которыми не хотел! Поэтому я изменил порядок выбора / сортировки. Первый выбор с последующей сортировкой был невозможен, но все наоборот работает отлично! Спасибо за ваш вклад, хотя:).

0 голосов
/ 19 июня 2009

вы можете поместить весь результат в переменную - затем, используя набор узлов, вы можете прибегнуть к результатам. см. здесь примеры использования набора узлов http://www.exslt.org/exsl/functions/node-set/index.html

Josh

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