2013-11-27 2 views
1

XSLT 1.0 표준은 일치 식의 StepPatern 부분에서 대부분의 XPath 축을 허용하지 않는다는 것을 알고 있습니다. (권장 대안이 Predicate에서 원하는 축을 사용 된 곳 this question를 참조하십시오.) XSLT 템플릿 일치 : 금지 된 축을 조건부로 이동하기위한 레시피

내가 노드 집합을 반환하는 복잡한 XPath 식을 갖고, node-set-expression합니다. 일치하는 템플릿을 만들고 싶습니다. node-set-expression / following-sibling::*. 해당 조건을 XSLT template 요소의 match 속성에서 사용할 수 있도록 술어를 사용하도록 다시 작성하는 일반적인 방법이 있습니까?

그리고 동등하게 번역 할 수있는 일반적인 방법이 다음

node-set-expression/ preceding-sibling::*

node-set-expression/ self-and-following-sibling::* (이 속기, 나는 그것이 not a valid axis 알고) 술어가 우승하면

다른 일반적인 접근법이 있습니까?

내가 전역 변수에 일치하는 노드를 미리 선택하여 이러한 경우를 처리하는 경향이 XSLT 2.0
+1

샘플 XML 파일, 일치시키는 노드의 템플릿 및 대상 노드를 포함 할 수 있습니까? –

답변

2

:

<xsl:variable name="special-nodes" select="//something/preceding-sibling::*"/> 

<xsl:template match="*[. intersect $special-nodes]"/> 

XSLT 3.0에서는이 그 일의

<xsl:template match="$special-nodes"/> 

에 더 장점을 단순화 이렇게하면 "특수 노드"를 한 번 검색하는 것이 apply-templates를 수행 할 때 모든 패턴에 대해 모든 노드를 테스트하는 것보다 훨씬 효율적일 수 있습니다. 그것은 또한 내 견해에서 조건을 더 분명하게 만듭니다.

XSLT 1.0에 대한 질문에 내가 아는 유일한 일반적인 솔루션은

<xsl:template match="*[count(.|//something/preceding-sibling::*) = 
         count(//something/preceding-sibling::*)]"> 

같은 패턴을 작성하는 것입니다하지만 그건 정말 너무 끔찍하게 비효율적 관조하는 것입니다.