2009-06-20 9 views

Odpowiedz

68

Bieżący węzeł jest niezależnie od tego, na którym szablon obecnie pracuje. Zwykle jest to również węzeł kontekstu, ale węzeł kontekstu ma specjalne znaczenie w zagnieżdżonym wyrażeniu XPath (część w nawiasach kwadratowych). Tam odnosi się do tego, który węzeł jest aktualnie testowany pod kątem dopasowania. W związku z tym węzeł kontekstu zmienia się w wyrażeniu XPath, ale nie w bieżącym węźle.

Węzeł kontekstu można skracać kropką (.) lub czasami całkowicie pominąć. Jest to prawdopodobnie trochę mylące, ponieważ poza zagnieżdżonym wyrażeniem kropka oznacza bieżący węzeł. (W takim przypadku bieżącym węzłem jest węzeł kontekstu, więc można powiedzieć, że jest on tylko bieżącym węzłem tylko w przybliżeniu, i jest on bardziej poprawnie nazywany węzłem kontekstu, ale nawet specyfikacja nazywa go bieżącym węzłem tutaj.)

Ponieważ kropka daje węzeł kontekstu, w zagnieżdżonym wyrażeniu XPath użytkownik potrzebuje sposobu odesłania do bieżącego węzła, który jest przetwarzany przez bieżący szablon. Możesz to zrobić za pomocą funkcji current().

Rozróżnienie tych dwóch jest użyteczne w niektórych przypadkach. Na przykład, załóżmy, że masz niektóre XML jak poniżej:

<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> 

Teraz załóżmy, że chcesz przekonwertować go do LaTeX tak:

foo\footnote{Batteries not included.} 
bar 

baz 
aak\footnote{Some assembly required.} 

eep 
blech\footnotemark[2] 

Sztuką jest powiedzieć, czy przypis został już użyty lub nie. Jeśli po raz pierwszy napotkasz przypis, chcesz napisać polecenie: \footnote; w przeciwnym razie chcesz napisać polecenie \footnotemark. Można użyć kodu XSL tak:

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

Tutaj mamy porównanie atrybut (od wyników zestaw węzłów preceding::*) kontekstu węzeł fn do bieżącego węzła fn-atrybut. (Tak naprawdę nie musisz mówić: ./@fn; można po prostu powiedzieć: @fn.)

Krótko mówiąc, węzeł kontekstu pozostawia cię wewnątrz predykatu XPath; bieżący węzeł sięga poza predykat, z powrotem do węzła przetwarzanego przez bieżący szablon.

+1

jak to się dzieje w przypadku osi własnej? – Devela