我有这个密钥,可能是空的:
<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,但希望有更简洁的方法。
答案 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)])