<apply-template>输出到变量中并对其进行访问

时间:2019-04-02 19:18:48

标签: xslt

我试图通过使用输出并将其存储在变量中来标识和复制元素数量。但是即使使用exsl:node-set()函数,输出也被视为单个节点/元素,我无法访问其中的单个元素。

我在Eclipse中使用标准的xslt处理器,它们是JRE实例默认值和Xalan 2.7.1

这是一个简单的XML文件,我将其用作更大任务的示例:

<root>
    <group>
        <type>2</type>
        <item>4</item>
        <item>5</item>
        <item>6</item>
    </group>
</root>

这是xslt:

<?xml version='1.0' encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common">

<xsl:template match="/"> 
    <root> 
        <xsl:variable name="items">
            <xsl:apply-templates select="//item" />
        </xsl:variable>

        items count: <xsl:value-of select="count(exsl:node-set($items))"/>
        item output: <xsl:value-of select="exsl:node-set($items)"/>
    </root>
</xsl:template>

<xsl:template match="item">
    <xsl:copy-of select="."/>
</xsl:template>

</xsl:stylesheet>

似乎node-set()不会将树片段转换为节点集,而只是创建一个节点/块。

输出:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:exsl="http://exslt.org/common">

    items count: 1
    item output:
</root>

实际上如何获得包含多个元素的节点集以进一步使用它?

谢谢!

2 个答案:

答案 0 :(得分:2)

要进行计数,请执行以下操作:

<xsl:value-of select="count(exsl:node-set($items)/item)"/>

否则,您要计算父变量,其中只有一个。同样,如果要处理变量中的项目,则需要执行以下操作:

<xsl:for-each select="exsl:node-set($items)/item"/>

有关变量的内容,请尝试:

<xsl:copy-of select="exsl:node-set($items)"/>

或者只是:

<xsl:copy-of select="$items"/>

(您无需将结果树片段转换为节点集即可进行复制)。

您的工作:

<xsl:value-of select="exsl:node-set($items)"/>

检索整个变量的字符串值,即“ 456”(在您报告时不为空)。

答案 1 :(得分:0)

更新:

由于技术上的麻烦,我未能意识到这不适用于XSL 1.0版。 Michael和我都注意到您的XPath不正确。下面的示例仅适用于XSL 2.0版或更高版本,因此请使用Michael的1.0版代码。


关键问题是用于处理变量的XPath表达式。

当您这样声明变量时:

    <xsl:variable name="items">
        <xsl:apply-templates select="//item" />
    </xsl:variable>

...您得到的是一个内存变量$items,具有以下内容:

    <item>4</item>
    <item>5</item>
    <item>6</item>

运行代码时,即使用xsl:value-of提取值的地方,我得到的默认行为是XSL吐出内容的字符串值:

<?xml version="1.0" encoding="UTF-8"?><root xmlns:exsl="http://exslt.org/common">

        items count: 1
        item output: 456</root>

由于我得到的输出略有不同,所以我不得不问-您正在使用哪种XSL处理器?

此外,该变量尤其是不是一个节点集,而是一个文档片段。因此,如果要访问该变量内的任何特定<item>元素,则需要将变量名称视为根。因此,如果您有count($items),由于只有一个根元素,因此您只能得到1。

要在{em> <item>之内计算$items元素,请指定正确的XPath:count($items/item)

此外,要输出变量的字符串值,您无需将其更改为节点集。

尝试使用此作为您的根模板:

<xsl:template match="/"> 
    <root> 
        <xsl:variable name="items">
            <xsl:apply-templates select="//item" />
        </xsl:variable>

        items count: <xsl:value-of select="count($items/item)"/>
        item output: <xsl:value-of select="$items"/>
    </root>
</xsl:template>

我的输出:

<?xml version="1.0" encoding="UTF-8"?><root xmlns:exsl="http://exslt.org/common">

        items count: 3
        item output: 456</root>