XML,XSL解析 - 无法显示表中的所有行

时间:2018-05-07 10:16:39

标签: html xml xslt

我试图用XML文档生成PDF。请在下面找到我的XML和XSL。

我希望它应该显示标记下的所有行,但是每个标记中只有第一个元素(行)。

请找到我的以下xml

[HttpPost]
public ActionResult Allowance (Allowance allowance) {
    return Json(new {
            newUrl = Url.Action("Payment", "Process")
        }
    );

请找我的xsl

<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>

在输出中,只有标签中的第一个元素来自而不是每个标签下的所有元素(行)。

例如:

输出:

<?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     s10
6     s92

1 个答案:

答案 0 :(得分:2)

您希望每line_number输出一行,而不是每page一行,因此xsl:for-each需要选择这些line_number元素

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

然后要获取line_numberproduct_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之外,因为你的表中应该只有一个这样的元素,而不是每行一个元素。