XSLT计算数组中的项目

时间:2016-06-06 07:18:30

标签: arrays xslt-1.0

我正在尝试修改XLST 1.0文件,我发现我可以使用这样的数组:

ctx.channel().writeAndFlush(...)

现在我想编写一个IF结构,我可以测试数组中的项目数量。

我试过这个,但这不起作用:

  <xsl:variable name="array">
    <Item>106</Item>
    <Item>107</Item>
  </xsl:variable>

我是否使用正确的方法处理此问题?

1 个答案:

答案 0 :(得分:3)

首先,XML中没有“数组”。

接下来,示例中的count($array)将始终返回1,因为您的变量包含单个父节点。要计算子Item个节点,您需要使用count($array/Item)

但是,这也会失败,因为在XSLT 1.0中,您的变量包含 result-tree-fragment - 而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>