2009-06-20 9 views

답변

68

현재 노드는 현재 템플릿이 작동되는 모든 노드입니다. 일반적으로 컨텍스트 노드 일 수도 있지만 컨텍스트 노드는 중첩 된 XPath 표현 (대괄호 안에있는 부분) 내에서 특별한 의미를 갖습니다. 여기에는 현재 일치하는 노드가 테스트 중입니다. 따라서 컨텍스트 노드는 XPath 표현식 내에서 변경되지만 현재 노드에서는 변경되지 않습니다.

컨텍스트 노드는 점 (.)으로 축약되거나 완전히 생략 될 수 있습니다. 중첩 된 표현식을 벗어나면 점은 현재 노드를 나타 내기 때문에 약간 혼란 스럽습니다. (이 경우 현재 노드는 컨텍스트 노드가되므로 현재 노드가 현재 노드 일 뿐이며 더 적절하게 컨텍스트 노드라고 할 수 있습니다. 그러나 스펙조차도 현재 노드라고합니다.)

점은 컨텍스트 노드를 제공하므로 중첩 된 XPath 식에서 사용자는 현재 템플릿으로 처리되는 현재 노드를 다시 참조 할 수있는 방법이 필요합니다. current() 함수를 통해이 작업을 수행 할 수 있습니다.

이 두 가지를 구별하는 것이 유용 할 때도 있습니다.

foo\footnote{Batteries not included.} 
bar 

baz 
aak\footnote{Some assembly required.} 

eep 
blech\footnotemark[2] 

트릭은 각주가 이미 사용되었는지 여부를 알 또는이다 :

<a> 
    <b> 
     <c>foo<footnote fn="1"/></c> 
     <d>bar</d> 
    </b> 
    <b> 
     <c>baz</c> 
     <d>aak<footnote fn="2"/></d> 
    </b> 
    <b> 
     <c>eep</c> 
     <d>blech<footnote fn="2"/></d> 
    </b> 
    <footnote-message fn="1">Batteries not included.</footnote> 
    <footnote-message fn="2">Some assembly required.</footnote> 
</a> 

지금이 같은 유액로 변환한다고 가정 : 예를 들어,이 같은 일부 XML이 있다고 가정 아니. 각주를 처음 접했을 경우 \footnote 명령을 쓰고 싶습니다. 그렇지 않으면 \footnotemark 명령을 작성하려고합니다. 이 같은 XSL 코드를 사용할 수 있습니다 여기에

<xsl:choose> 
    <xsl:when test="count(preceding::*[./@fn = current()/@fn]) = 0">\footnote{...}</xsl:when> 
    <xsl:otherwise>\footnotemark[...]</xsl:otherwise> 
</xsl:choose> 

우리는 현재 노드에합니다 (preceding::* 노드 집합의 결과에서) 문맥 노드 fn 속성을 비교하는 fn 속성. (실제로는 ./@fn을 말할 필요가 없으며, 단지 @fn이라고 말할 수 있습니다.)

간단히 말해, 컨텍스트 노드는 XPath 조건 자의 내부에있게합니다. 현재 노드는 술어 외부로 도달하고 현재 템플리트가 처리중인 노드로 돌아갑니다.

+1

자축과 어떤 관련이 있습니까? – Devela