我试图通过使用并将输出存储在变量中来识别和复制元素数量。但即使使用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>
我如何实际获得多个元素的节点集以进一步使用它?
提前致谢!
对于计数,请执行:
<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”(报告时不为空)。
由于我的技术打嗝,我没有意识到这不适用于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>