是否可以计算xslt键中的项目数?

时间:2013-02-28 18:31:58

标签: xslt key

我有这个密钥,可能是空的:

<xsl:key 
         name="k1" 
         match="div[contains(@class, 'contents')]/node()[not(self::br) and not(ancestor-or-self::p)]" 
         use="generate-id(following-sibling::br[1])"/>

目前检查它是否为空(在xsl:模板块中匹配div [contains(@class,'contents')])我重新运行xpath(例如):

 <xsl:when test="count(node()[not(self::br) and not(ancestor-or-self::p)]) > 1">

为什么我可以只计算一个键中的项目,例如:

 <xsl:when test="count(key('k1', *) > 1">

我考虑使用<xsl:for-each>并将isempty var指定为false,但希望有更简洁的方法。

3 个答案:

答案 0 :(得分:1)

您可以计算映射到特定键值的节点数,但不计算整个键已知的节点总数(除了作为映射到每个值的所有节点集的并集) )。我将使用相同的match定义第二个键,但使用不同的use

<xsl:key 
     name="k2" 
     match="div[contains(@class, 'contents')]/node()[not(self::br) and not(ancestor-or-self::p)]" 
     use="generate-id(..)"/>

然后使用div[contains(@class, 'contents')]

count(key('k2', generate-id()))模板中获取计数

答案 1 :(得分:1)

如果您在use属性中使用常量创建第二个键:

<xsl:key 
     name="k1_all" 
     match="div[contains(@class, 'contents')]/node()[not(self::br) and not(ancestor-or-self::p)]" 
     use="'all'"/>

然后你可以简单地使用:

<xsl:value-of select="count(key('k1_all','all'))"/>

至少像这样,您可以将两个密钥(一个用于查找,一个用于计数)直接放在XSLT文件中,以便复杂的XPath更易于维护。

答案 2 :(得分:0)

只需使用

count(//div[contains(@class, 'contents')]/node()
                              [not(self::br) and not(ancestor-or-self::p)])