2011-03-18 2 views
1

내가 예를 들어, 템플릿 패턴을 사용하여, 푸시 변환에 <xsl:key>을 사용하고 있습니다 :푸시 변환의 XSLT 키, 더 나은 성능?

<xsl:template match="key('div', 'MAIN')"> 
... 
</xsl:template> 

... 대신이 어떤이있는 경우 그러나

<xsl:template match="html:div[upper-case(@id) = 'MAIN']"> 
... 
</xsl:template> 

, 나도 몰라 성능상의 이점이 있으며, 최근에 푸시 변환이므로 노드를 방문한 상태에서 핵심이 정말 유용합니까? 성능 차이는 무시할 수 있지만

+2

키는 _dynamic_ 상호 참조를위한 것입니다. 성능 정보 : 반복적 인 사용 만이 차이를 만듭니다. –

+0

@Alejandro에 동의합니다. – Flack

+0

좋은 질문입니다, +1. 설명에 대한 내 대답을 참조하십시오 왜 템플릿의 일치 표현은 일반적으로 덜 효율적일 수있는 키 기능을 사용하십시오. –

답변

2

은 성능 비교했을 때의 그것

<xsl:template match="key('div', 'MAIN')"> 

하면 :

<xsl:template match="html:div[upper-case(@id) = 'MAIN']"> 

는 후자의 효율적 어쨌든 여기서되어 보인다 key() 함수는 상당한 수의 노드를 선택합니다.

설명하십시오 key()key() 함수에 의해 리턴 노드 집합에있는 노드의 조합과 일치 동등 매칭

  1. . 따라서 XSLT 프로세서는 현재 노드가 해당 노드 집합에 속하는지 결정해야합니다. 특히, key() 함수에 의해 선택된 노드 집합이 중요한 경우, 이는 비효율적 인 연산 일 수 있습니다.

  2. 두 번째 경우에는 간단한 일치가 있습니다. 현재 노드가 일치 식과 일치하는지 여부를 결정하는 것은 단 하나의 노드 테스트와 간단한 조건의 검증을 포함합니다. 이것은 일반적으로 현재 노드의 구성원을 큰 노드 집합으로 검사하는 것보다 간단합니다.

+0

+1 좋은 설명. – Tomalak

1

매우 가끔 일치 패턴에 사용 된 key()가 표시됩니다. 키의 "사용"상태가 매우 복잡하고 키가 색인 작성 비용을 상각하기에 충분할만큼 자주 사용되지 않는 한, 중요한 성능 이점을 제공하는 것은 거의 불가능하다고 생각합니다. 성능 질문에 대해서는 항상 그렇듯이 사용중인 프로세서에 따라 다르며 실제로 알아낼 수있는 유일한 방법은이를 측정하는 것입니다.