我试图通过使用输出并将其存储在变量中来标识和复制元素数量。但是即使使用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>
实际上如何获得包含多个元素的节点集以进一步使用它?
谢谢!
答案 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>