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] в конец выбранного вами выбора для каждого приведет к тому, что будет напечатано только первое совпадение.

Другие вопросы по тегам