2

我有这把钥匙,它可能是空的:

<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])"/>

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

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

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

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

我考虑过使用 a<xsl:for-each>并将 isempty var 分配给 false,但希望有一种更清洁的方法。

4

3 回答 3

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()))

于 2013-02-28T19:48:06.707 回答
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 就更易于维护。

于 2013-05-15T19:34:56.710 回答
0

只需使用

count(//div[contains(@class, 'contents')]/node()
                              [not(self::br) and not(ancestor-or-self::p)])
于 2013-03-01T04:18:08.603 回答