XSLT - печать первого узла из набора идентичных узлов
Я столкнулся с проблемой, пытаясь напечатать одну строку только для набора идентичных узлов, и я не смог найти аналогичный пост для идентичных узлов.
У меня есть входной XML-файл, содержащий набор идентичных узлов, например, это выглядит так:
<BookDetails>
<BK ISBN="123362367127" Shelf="Y" />
<BK ISBN="123362367127" Shelf="Y" />
<BK ISBN="123362367127" Shelf="Y" />
<BK ISBN="123362367127" Shelf="Y" />
</BookDetails>
То, что я хочу, это напечатать информацию этой книги только один раз. Я думаю, что решением моей проблемы может быть группировка мюнхен, например, группа по значению ISBN, а затем из группы вывести только первое.
Исходя из этого мой код выглядит так:
<xsl:key name="UniqueBKs" match="BK" use="@ISBN"/>
<xsl:template name="BookDetails">
<fo:table width="160mm" table-layout="fixed">
<fo:table-column column-width="80mm" column-number="1"/>
<fo:table-column column-width="80mm" column-number="2"/>
<fo:table-body>
<xsl:for-each select="BK[generate-id() = generate-id(key('UniqueBKs', @ISBN)[1])]">
<fo:table-row>
<xsl:apply-templates select="."/>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</fo:table>
</xsl:template>
а также:
<xsl:template match="BK">
<fo:table-cell>
<fo:block font-family="arial" font-size="8pt" text-align="left">
<xsl:text>ISBN:</xsl:text>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-family="arial" font-size="8pt" text-align="right">
<xsl:value-of select="@ISBN"/>
</fo:block>
</fo:table-cell>
</xsl:template>
если мой входной XML-файл состоит только из одного элемента BK, код работает нормально. Если у меня больше одного, как показано выше, Apache FOP возвращает мне ошибку, связанную с ячейками таблицы: "Номер столбца или количество ячеек в строке переполняет число fo:table-columns, указанное для таблицы".
Ошибка указывает на то, что я пытаюсь поместить больше ячеек таблицы в строку таблицы, в то время как: а) я ожидаю, что будет напечатана только 1 строка для этого примера; б) будет создано больше строк в случае большего количества номеров ISBN, а не ячеек таблицы.,
Любая помощь будет оценена, спасибо!
2 ответа
Это действительно
<xsl:template name="BookDetails">
Я думаю, что это должно быть
<xsl:template match="BookDetails">
или же
<xsl:template name="BookDetails" match="BookDetails">
<xsl:for-each select="BK[1]">
<xsl:value-of select".">
</xsl:for-each>
Добавление [1] в конец выбранного вами выбора для каждого приведет к тому, что будет напечатано только первое совпадение.