2013-02-28 2 views
2

I 비어 좋고,이 키가 (: 템플릿 블록 매칭 된 div [포함 (@class, '내용')]는 XSL이 투입) I는 XPath를 재실행 빈의 경우xslt 키의 항목 수를 계산할 수 있습니까?

<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: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로 지정하고 더 깨끗한 방법이 있기를 바란다.

답변

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(..)"/> 

을하고 간단하게 사용 count(key('k2', generate-id()))

0

를 사용하여 div[contains(@class, 'contents')] 템플릿 내에서 카운트를 얻을 :

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

답장을 보내 주셔서 감사합니다. - 제가하는 일이 효과적이지만, 여러 번 쿼리를 실행하지 않아도되고, 한 번 계산하고 한 번 키를 생성해야한다고 생각했습니다. – Tom

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를 유지 관리하기가 더 쉽습니다.

관련 문제