在 xslt 3.0 中使用累加器无法正常工作
use of accumulator in xslt 3.0 not working as I need
我有一个 XML,其中有一个图书列表,其中包含标题、价格、作者、附加价格、艺术家、国家等属性。XML 如下。
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<additionalprice>12.90</additionalprice>
<year>1985</year>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<additionalprice>10.90</additionalprice>
<year>1988</year>
</cd>
等等
我想编写一个应用于 XML 的 XSLT 3.0 以获得 HTML。我想使用累加器来获取目录中的书籍总数。尽管有更好的方法,但我只是想将累加器用于练习目的,并在 table 包含书籍的末尾打印总计,其中列是标题、作者和总价。对于标题和作者的填写,我使用了 for-each。总价=价格+附加价。我想使用迭代来提交总价。谁能帮我解决这个问题。我不完整的样式表如下所示:
<?xml version="3.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="2">
<tr bgcolor="#9acd32">
<th style="text-align:left">Title</th>
<th style="text-align:left">Artist</th>
<th style="text-align:left">Total Price</th>
</tr>
<xsl:accumulator name="total" as="xs:integer" initial-value="0" streamable="no">
<xsl:accumulator-rule match="title" select="$value+1"/>
</xsl:accumulator>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
<tr bgcolor="#FFA500">
<td> Total number of Books </td>
<td> <xsl:value-of select="accumulator-before('total')"/</td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
我不想使用流媒体。
如果您查看规范 https://www.w3.org/TR/xslt-30/#accumulator-declaration,您会发现 xsl:accumulator
是一个声明,这意味着您必须将其用作 [=12] 的顶级 element/child =], 不在模板内。
并且累加器值与节点和函数相关联 https://www.w3.org/TR/xslt-30/#func-accumulator-before "Returns the pre-descent value of the selected accumulator at the context node" 所以在你的情况下,你有一个带有上下文节点 /
的模板是在值之前访问累加器没有多大意义,您更需要 accumulator-after
值。
最后要声明累加器要应用到默认模式
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:math="http://www.w3.org/2005/xpath-functions/math" exclude-result-prefixes="xs math"
version="3.0">
<xsl:mode use-accumulators="#all"/>
<xsl:accumulator name="total" as="xs:integer" initial-value="0" streamable="no">
<xsl:accumulator-rule match="title" select="$value + 1"/>
</xsl:accumulator>
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="2">
<tr bgcolor="#9acd32">
<th style="text-align:left">Title</th>
<th style="text-align:left">Artist</th>
<th style="text-align:left">Total Price</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td>
<xsl:value-of select="title"/>
</td>
<td>
<xsl:value-of select="artist"/>
</td>
</tr>
</xsl:for-each>
<tr bgcolor="#FFA500">
<td> Total number of Books </td>
<td>
<xsl:value-of select="accumulator-after('total')"/>
</td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
我有一个 XML,其中有一个图书列表,其中包含标题、价格、作者、附加价格、艺术家、国家等属性。XML 如下。
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<additionalprice>12.90</additionalprice>
<year>1985</year>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<additionalprice>10.90</additionalprice>
<year>1988</year>
</cd>
等等
我想编写一个应用于 XML 的 XSLT 3.0 以获得 HTML。我想使用累加器来获取目录中的书籍总数。尽管有更好的方法,但我只是想将累加器用于练习目的,并在 table 包含书籍的末尾打印总计,其中列是标题、作者和总价。对于标题和作者的填写,我使用了 for-each。总价=价格+附加价。我想使用迭代来提交总价。谁能帮我解决这个问题。我不完整的样式表如下所示:
<?xml version="3.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="2">
<tr bgcolor="#9acd32">
<th style="text-align:left">Title</th>
<th style="text-align:left">Artist</th>
<th style="text-align:left">Total Price</th>
</tr>
<xsl:accumulator name="total" as="xs:integer" initial-value="0" streamable="no">
<xsl:accumulator-rule match="title" select="$value+1"/>
</xsl:accumulator>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
<tr bgcolor="#FFA500">
<td> Total number of Books </td>
<td> <xsl:value-of select="accumulator-before('total')"/</td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
我不想使用流媒体。
如果您查看规范 https://www.w3.org/TR/xslt-30/#accumulator-declaration,您会发现 xsl:accumulator
是一个声明,这意味着您必须将其用作 [=12] 的顶级 element/child =], 不在模板内。
并且累加器值与节点和函数相关联 https://www.w3.org/TR/xslt-30/#func-accumulator-before "Returns the pre-descent value of the selected accumulator at the context node" 所以在你的情况下,你有一个带有上下文节点 /
的模板是在值之前访问累加器没有多大意义,您更需要 accumulator-after
值。
最后要声明累加器要应用到默认模式
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:math="http://www.w3.org/2005/xpath-functions/math" exclude-result-prefixes="xs math"
version="3.0">
<xsl:mode use-accumulators="#all"/>
<xsl:accumulator name="total" as="xs:integer" initial-value="0" streamable="no">
<xsl:accumulator-rule match="title" select="$value + 1"/>
</xsl:accumulator>
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="2">
<tr bgcolor="#9acd32">
<th style="text-align:left">Title</th>
<th style="text-align:left">Artist</th>
<th style="text-align:left">Total Price</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td>
<xsl:value-of select="title"/>
</td>
<td>
<xsl:value-of select="artist"/>
</td>
</tr>
</xsl:for-each>
<tr bgcolor="#FFA500">
<td> Total number of Books </td>
<td>
<xsl:value-of select="accumulator-after('total')"/>
</td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>