Xml 在xslt 3.0中使用累加器不能按我的需要工作

Xml 在xslt 3.0中使用累加器不能按我的需要工作,xml,xslt,xslt-3.0,Xml,Xslt,Xslt 3.0,我有一个XML,其中有一个图书列表,其属性包括标题、价格、作者、附加价格、艺术家、国家等。XML如下所示 皇帝讽刺剧 鲍勃·迪伦 美国 哥伦比亚 10.90 12.90 1985 隐藏你的心 邦尼泰勒 英国 哥伦比亚唱片公司 9.90 10.90 1988 等等 我想编写一个应用于XML的XSLT 3.0来获取HTML。我想用累加器得到目录中的图书总数。虽然有更好的方法,但我只是想使用累加器进行练习,并在包含书籍的表格末尾打印总数,其中列为标题、作者和总价。对于填写标题和作者,我分别使用。总

我有一个XML,其中有一个图书列表,其属性包括标题、价格、作者、附加价格、艺术家、国家等。XML如下所示


皇帝讽刺剧
鲍勃·迪伦
美国
哥伦比亚
10.90
12.90
1985
隐藏你的心
邦尼泰勒
英国
哥伦比亚唱片公司
9.90
10.90
1988
等等

我想编写一个应用于XML的XSLT 3.0来获取HTML。我想用累加器得到目录中的图书总数。虽然有更好的方法,但我只是想使用累加器进行练习,并在包含书籍的表格末尾打印总数,其中列为标题、作者和总价。对于填写标题和作者,我分别使用。总价=价格+附加价格。我想用iterate来填写总价。谁能帮我一下吗。我的不完整样式表如下所示:


我的CD收藏
标题
艺术家
总价
图书总数
如果您查看规范,就会发现
xsl:acculator
是一个声明,这意味着您必须将其用作
xsl:stylesheet
的顶级元素/子元素,而不是模板内部

累加器值与节点相关联,函数如“返回上下文节点上所选累加器的下降前值”,因此在您的情况下,如果您有一个带有上下文节点
/
is的单一模板,则访问累加器之前的值没有多大意义,您需要在
值之后使用
累加器

最后,您必须声明累加器将应用于默认模式

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

我的CD收藏
标题
艺术家
总价
图书总数
如果查看规范,您会看到
xsl:acculator
是一个声明,这意味着您必须将其用作
xsl:stylesheet
的顶级元素/子元素,而不是模板内部

累加器值与节点相关联,函数如“返回上下文节点上所选累加器的下降前值”,因此在您的情况下,如果您有一个带有上下文节点
/
is的单一模板,则访问累加器之前的值没有多大意义,您需要在
值之后使用
累加器

最后,您必须声明累加器将应用于默认模式

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

我的CD收藏
标题
艺术家
总价
图书总数

上述方法对我不适用@Martin。不知道为什么。在删除行中,我得到一个需要累加器填充的值为空的输出。要使用XSLT 3,您需要使用XSLT 3处理器,您链接到的工具不是XSLT 3处理器。据我所知,符合今年最终XSLT3规范的XSLT3实现是Saxon 9.8和Altova 2017 R3或2018,因此如果您想使用XSLT3,我建议您尝试其中之一。Saxon 9.8他将您的输入固定为格式良好且完整,并且我的代码片段包含在完整的
xsl:stylesheet
中,为('total')
之后的
累加器输出
2
,Altova XMLSpy 2018也是如此。我已编辑代码片段并将其转换为完整的样式表,以防万一,您的问题是由于前面的代码片段只包含样式表主体的相关代码造成的。在我从Altova开始使用xml spy之后,它工作得很好。上面的代码对我@Martin不起作用。不知道为什么。在删除行中,我得到一个需要累加器填充的值为空的输出。要使用XSLT 3,您需要使用XSLT 3处理器,您链接到的工具不是XSLT 3处理器。据我所知,符合今年最终XSLT3规范的XSLT3实现是Saxon 9.8和Altova 2017 R3或2018,因此如果您想使用XSLT3,我建议您尝试其中之一。Saxon 9.8他将您的输入固定为格式良好且完整,并且我的代码片段包含在完整的
xsl:stylesheet
中,为('total')
之后的
累加器输出
2
,Altova XMLSpy 2018也是如此。我已编辑代码片段并将其转换为完整的样式表,以防万一,您的问题是由于上一个代码片段只包含样式表主体的相关代码造成的