我正在尝试修改XLST 1.0文件,我发现我可以使用这样的数组:
<xsl:variable name="array">
<Item>106</Item>
<Item>107</Item>
</xsl:variable>
现在我想编写一个 IF 结构,在其中测试数组中的项目数量。
我试过这个,但这不起作用:
<xsl:if test="count($array) = 0"></xsl:if>
我是否使用了正确的方法来解决此问题?
首先,XML中没有"数组"。
接下来,示例中的count($array)
将始终返回 1,因为变量包含单个父节点。要计算子节点Item
,您需要使用 count($array/Item)
。
中,变量包含一个结果树片段,而 XSLT 1.0 只能计算节点集中的节点。
一种解决方案是使用扩展函数(几乎所有 XSLT 1.0 处理器都支持该函数)将 RTF 转换为节点集。例如,以下样式表:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:variable name="array-rtf">
<Item>106</Item>
<Item>107</Item>
</xsl:variable>
<xsl:variable name="array" select="exsl:node-set($array-rtf)" />
<xsl:template match="/">
<test>
<xsl:value-of select="count($array/Item)"/>
</test>
</xsl:template>
</xsl:stylesheet>
返回:
<?xml version="1.0" encoding="UTF-8"?>
<test>2</test>
另一种选择是使用内部元素而不是变量:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="http://example.com/my"
exclude-result-prefixes="my">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<my:array>
<Item>106</Item>
<Item>107</Item>
</my:array>
<xsl:template match="/">
<test>
<xsl:value-of select="count(document('')/*/my:array/Item)"/>
</test>
</xsl:template>
</xsl:stylesheet>