XML, синтаксический анализ XSL - не удалось отобразить все строки в таблице - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь создать PDF из документа XML. Пожалуйста, найдите мои ниже XML и XSL для того же.

Я ожидаю, что в теге должны отображаться все строки, но в каждом теге я получаю только самый первый элемент (строки).

Пожалуйста, найдите мой ниже xml

<receipt>
<order>
    <page></page>
    <page>
        <line_number>1</line_number>
        <product_code>S10</product_code>
        <line_number>2</line_number>
        <product_code>S20</product_code>
        <line_number>3</line_number>
        <product_code>S92</product_code>
    </page>
    <page>
        <line_number>6</line_number>
        <product_code>S92</product_code>
        <line_number>7</line_number>
        <product_code>S31</product_code>
        <line_number>8</line_number>
        <product_code>S31</product_code>
    </page>
</order>
</receipt>

Пожалуйста, найдите мой xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"   
                              xmlns:date="http://exslt.org/dates-and-times" extension-element-prefixes="date">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="/receipt">
        <html>
            <head>
            <style>@page {size: a4 landscape;}</style>
            </head>
            <body>

                <table >
                    <thead>
                        <tr >
                            <th >Line</th>
                            <th>Item Code</th>
                        </tr>
                    </thead>
                <xsl:for-each select="order/page" >
                                    <tbody>
                                        <tr style="font-size: 9px; ">
                                            <td ><xsl:value-of select="line_number" /></td>
                                            <td ><xsl:value-of select="product_code" /></td>
                                        </tr>
                                    </tbody>
                </xsl:for-each>
                </table>
                <br />

            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

В выводе идет только 1-й элемент в теге вместо всех элементов (строк) под каждым тегом.

например:

вывод:

1     s10
6     s92

Ожидаемый результат

1     s10
2     s20
3     s92
6     s92
7     s31
8     s31  

1 Ответ

0 голосов
/ 07 мая 2018

Вы хотите вывести одну строку на line_number, а не одну строку на page, поэтому вам xsl:for-each необходимо выбрать эти line_number элементы

<xsl:for-each select="order/page/line_number">

Затем, чтобы получить значение line_number и следующее product_code, сделайте это ...

<td><xsl:value-of select="." /></td>
<td><xsl:value-of select="following-sibling::product_code[1]" /></td>

Попробуйте это ...

<xsl:template match="/receipt">
    <html>
        <head>
        <style>@page {size: a4 landscape;}</style>
        </head>
        <body>
            <table >
                <thead>
                    <tr>
                        <th>Line</th>
                        <th>Item Code</th>
                    </tr>
                </thead>
                <tbody>
                    <xsl:for-each select="order/page/line_number">
                        <tr style="font-size: 9px; ">
                            <td><xsl:value-of select="." /></td>
                            <td><xsl:value-of select="following-sibling::*[1][self::product_code]" /></td>
                        </tr>
                    </xsl:for-each>
                </tbody>
            </table>
            <br />
        </body>
    </html>
</xsl:template>

Обратите внимание, что при этом предполагается, что за каждым line_number будет следовать product_code.

(Я также перенес создание элемента tbody за пределы xsl:for-each, поскольку в вашей таблице должен быть только один такой элемент, а не один для каждой строки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...