2013-05-30 6 views
0

Мой XML-тег содержит много элементов, которые должны быть созданы как три разные группы с аналогичными (но разными) правилами сортировки.XSLT 2.0 - Двухэтапная сортировка

Это то, что я хочу получить:

<items> 
    <!-- Header - for-each sorting --> 
    <item name="something1_A"/> 
    <item name="something2_B"/> 
    <item name="something3_C"/> 

    <!-- Body - for-each-group sorting --> 
    <item name="something4_D"/> 
    <item name="something4_E"/> 
    <item name="something5_D"/> 
    <item name="something5_E"/> 

    <!-- Footer - for-each sorting --> 
    <item name="something6_F"/> 
    <item name="something6_G"/> 
    <item name="something6_H"/> 
</items> 

Первоначально заказ детали является случайным.

Первый сорт должен создать эти три разные части:: поместить все, что является заголовком сверху, все, что является нижним колонтитулом внизу, и сохранить все остальное, где оно находится. Я могу определить, должно ли что-то идти в заголовке, в теле или в нижнем колонтитуле, глядя на его окончание (значение после последнего подчеркивания).

Вторая сортировка должна работать по-разному на каждой из этих частей. (сортировка по элементам для верхнего и нижнего колонтитула, для групповой сортировки для тела).

Я знаю, как я могу сортировать заголовок, тело и нижний колонтитул (спасибо this answer), но не как их перемещать и сортировать по разным алгоритмам.

+0

Вы имеете в виду пользовательскую сортировку? –

+0

@NavinRawat Я не знаю, как правильно это назвать. Может быть, если бы я мог написать лучший 'select', у меня было бы три xsl: sort only, один для части. –

ответ

2

Предполагая, что у вас есть template, что соответствует items, то это просто случай разделения item элементов на три группы, которые вы говорите, вы можете сделать это с помощью окончаний:

<xsl:variable name="headerItems" select="item[ 
    some $suf in ('_A', '_B', '_C') satisfies ends-with(@name, $suf)]" /> 
<xsl:variable name="footerItems" select="item[ 
    some $suf in ('_F', '_G', '_H') satisfies ends-with(@name, $suf)]" /> 
<xsl:variable name="bodyItems" 
    select="item except ($headerItems | $footerItems)" /> 

и затем обработать три группы в последовательности, но вам нужно.

+0

Спасибо за чистое (и рабочее) решение :) –

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