Использование xsl-групп-запуск-покупка для группирования элементов между двумя узлами

#xml #xslt #xslt-2.0 #xslt-grouping

#xml #xslt #xslt-2.0 #xslt-группировка

Вопрос:

Итак, у меня есть XML, похожий на что-то подобного типа, который я хотел бы преобразовать в wikicode:

 lt;resultgt;  lt;h3gt;Heading 1lt;/h3gt;  lt;docgt;  lt;filepathgt;Filepath 1lt;/filepathgt;  lt;filenamegt;Filename 1lt;/filenamegt;  lt;descriptiongt;Desc 1lt;/descriptiongt;  lt;/docgt;  lt;docgt;  lt;filepathgt;Filepath 12lt;/filepathgt;  lt;filenamegt;Filename 12lt;/filenamegt;  lt;descriptiongt;Desc 12lt;/descriptiongt;  lt;/docgt;  lt;h3gt;Heading 2lt;/h3gt;  lt;docgt;  lt;filepathgt;Filepath 21lt;/filepathgt;  lt;filenamegt;Filename 21lt;/filenamegt;  lt;descriptiongt;Desc 21lt;/descriptiongt;  lt;/docgt;  lt;docgt;  lt;filepathgt;Filepath 22lt;/filepathgt;  lt;filenamegt;Filename 22lt;/filenamegt;  lt;descriptiongt;Desc 22lt;/descriptiongt;  lt;/docgt;  lt;h3gt;Heading 3lt;/h3gt;  lt;docgt;  lt;filepathgt;Filepath 31lt;/filepathgt;  lt;filenamegt;Filename 31lt;/filenamegt;  lt;descriptiongt;Desc 31lt;/descriptiongt;  lt;/docgt;  lt;docgt;  lt;filepathgt;Filepath 31lt;/filepathgt;  lt;filenamegt;Filename 31lt;/filenamegt;  lt;descriptiongt;Desc 31lt;/descriptiongt;  lt;/docgt;  lt;resultgt;     

Что я хотел бы сделать, так это сгруппировать все элементы документа по h3 над ними. Иметь что-то подобное :

 *Heading 1 **Filename1 : Desc1 **Filename12 : Desc12 *Heading 2 **Filename 21 : Desc21 **Filename 22 : Desc22  

Вот фрагмент моего xsl :

 lt;xmlgt;  lt;xsl:for-each-group select=".//result" group-starting-with="h3"gt;  *lt;xsl:value-of select="current()"/gt;  lt;xsl:for-each select="current-group()"gt;  **lt;xsl:value-of select="./doc/filename"/gt; : lt;xsl:value-of select="./doc/description"/gt;   lt;/xsl:for-eachgt;  lt;/xsl:for-each-groupgt; lt;/xmlgt;  

Однако это не работает, и значение current() отправляет мне значение всех подузлов, что мне не нужно. Мое базовое понимание XSL немного ограничено. Любая помощь будет признательна. Спасибо.

Комментарии:

1. Почему Heading 3 и его два doc элемента исключены из вашего вывода?

Ответ №1:

Используйте xsl:for-each-group select=".//result/*" group-starting-with="h3" , если входные данные такие, как показано на рисунке.

И внутри я думаю, что вы хотите обработать lt;xsl:for-each select="current-group()[position() ge 1]"gt; или lt;xsl:for-each select="current-group()[not(self::h3)]"gt; обработать элементы, следующие за h3 «и value-of «, затем относительно них и использовать select="filename" «и select="description" «.