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

use 属性で定数を使用して2 番目のキーを作成する場合:

<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 ファイル内で 2 つのキー (1 つは検索用、もう 1 つはカウント用) を直接隣り合わせに配置できるため、複雑な XPath の保守が容易になります。

于 2013-05-15T19:34:56.710 に答える
1

特定のキー値にマップされたノードの数は数えることができますが、キー全体に認識されているノードの総数は数えることはできません (各値にマップされたすべてのノード セットの和集合としてではありません)。match同じであるが異なる2 番目のキーを定義します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 に答える
0

単に使用します

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