我试图用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
答案 0 :(得分:2)
您希望每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
之外,因为你的表中应该只有一个这样的元素,而不是每行一个元素。