#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"
«.