У меня есть следующий XML-документ, и я хочу сгруппировать книги по групповому тегу и объединить все идентификаторы (заголовки) группы в CSV-файл с использованием Java и XSLT 1 .
Кроме того, я хотел бы иметь сводный элемент, содержащий всю общую информацию о серии книг (SeriesInfo), а также два элемента в каждой группе;один (например, заголовки), содержащий все заголовки (идентификаторы) этой группы, разделенные запятой (csv), и один (например, AnyTitle), содержащий любой заголовок (какой из них не имеет значения, первый или последний в порядке).
I 'Мы сумели выполнить группировку по Muenchian Grouping, но не знаем, как получить CSV и любой элемент. Я провел некоторые исследования по этому вопросу, но решения, которые я нашел, были либо исключительно конкретными, либо с использованием XSLT 2. или выше.
Исходный XML
<?xml version="1.0" encoding="UTF-8"?>
<Books>
<Book>
<Title>Harry Potter and the philosopher's stone</Title>
<Group>Harry Potter</Group>
<Author>J.K.R.</Author>
<Pages>650</Pages>
</Book>
<Book>
<Title>Harry Potter and the chamber of secrets</Title>
<Group>Harry Potter</Group>
<Author>J.K.R.</Author>
<Pages>700</Pages>
</Book>
<Book>
<Title>Lord of the Rings complete edition</Title>
<Group>Lord of the Rings</Group>
<Author>J.R.R. Tolkien</Author>
<Pages>2500</Pages>
</Book>
</Books>
Целевой XML
<?xml version="1.0" encoding="UTF-8"?>
<Serieses>
<Series>
<Group>Harry Potter</Group>
<Titles>Harry Potter and the philosopher's stone,Harry Potter and the chamber of secrets</Titles>
<AnyTitle>Harry Potter and the chamber of secrets</AnyTitle>
<Books>
<Book>
<Title>Harry Potter and the philosopher's stone</Title>
<Group>Harry Potter</Group>
<Pages>650</Pages>
</Book>
<Book>
<Title>Harry Potter and the chamber of secrets</Title>
<Group>Harry Potter</Group>
<Pages>700</Pages>
</Book>
</Books>
<SeriesInfo>
<Author>J.K.R.</Author>
<Group>Harry Potter</Group>
</SeriesInfo>
</Series>
<Series>
<Group>Lord of the Rings</Group>
<Titles>Lord of the Rings complete edition</Titles>
<AnyTitle>Lord of the Rings complete edition</AnyTitle>
<Books>
<Book>
<Title>Lord of the Rings complete edition</Title>
<Group>Lord of the Rings</Group>
<Pages>2500</Pages>
</Book>
</Books>
<SeriesInfo>
<Author>J.R.R. Tolkien</Author>
<Group>Lord of the Rings</Group>
</SeriesInfo>
</Series>
</Serieses>
Используя следующий XSLT
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:key name="book-by-name" match="Book" use="Group" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="Books">
<Serieses>
<xsl:apply-templates
select="Book[generate-id() = generate-id(key('book-by-name', Group)[1])]"
mode="group" />
</Serieses>
</xsl:template>
<xsl:template match="Book" mode="group">
<Series>
<xsl:copy-of select="Group" />
<Books>
<xsl:apply-templates
select="key('book-by-name', Group)" />
</Books>
<SeriesInfo>
<xsl:copy-of select="Author" />
<xsl:copy-of select="Group" />
</SeriesInfo>
</Series>
</xsl:template>
<xsl:template match="Book">
<Book>
<xsl:apply-templates
select="node()[self::Title|self::Group|self::Pages]" />
</Book>
</xsl:template>
</xsl:stylesheet>
Мне удалось получить следующий вывод:
<?xml version="1.0" encoding="UTF-8"?>
<Serieses>
<Series>
<Group>Harry Potter</Group>
<Books>
<Book>
<Title>Harry Potter and the philosopher's stone</Title>
<Group>Harry Potter</Group>
<Pages>650</Pages>
</Book>
<Book>
<Title>Harry Potter and the chamber of secrets</Title>
<Group>Harry Potter</Group>
<Pages>700</Pages>
</Book>
</Books>
<SeriesInfo>
<Author>J.K.R.</Author>
<Group>Harry Potter</Group>
</SeriesInfo>
</Series>
<Series>
<Group>Lord of the Rings</Group>
<Books>
<Book>
<Title>Lord of the Rings complete edition</Title>
<Group>Lord of the Rings</Group>
<Pages>2500</Pages>
</Book>
</Books>
<SeriesInfo>
<Author>J.R.R. Tolkien</Author>
<Group>Lord of the Rings</Group>
</SeriesInfo>
</Series>
</Serieses>
Использование более новой версии XSLT мне не очень помогает, потому что мне нужнополагаться на стандартную библиотеку.
РЕДАКТИРОВАТЬ: Уточнил, что я имел в виду под любым названием: не имеет значения, первое или последнее в порядке.