output into a variable and accessing it

问题描述 投票:0回答:2

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

我在Eclipse中使用标准的xslt处理器,它们是JRE Instance Default和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>

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

提前致谢!

xslt
2个回答
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”(报告时不为空)。


0
投票

Update:

由于我的技术打嗝,我没有意识到这不适用于XSL 1.0版。迈克尔和我都注意到你的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,因为只有一个根元素。

要计算<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>
© www.soinside.com 2019 - 2024. All rights reserved.