Węzeł bieżący a węzeł kontekstowy w XSLT / XPath?

W XSLT, jaka jest różnica między "węzłem bieżącym" a "węzłem kontekstowym"? Oba użyte terminy znajdziesz tutaj: http://www.w3.org/TR/xslt .

Kiedy użyjesz jednego czy drugiego? Jak odnosisz się do każdego?

Author: bluish, 2009-06-20

2 answers

Bieżący węzeł jest tym, na czym aktualnie działa szablon. Zwykle jest to również węzeł kontekstowy, ale węzeł kontekstowy ma specjalne znaczenie w zagnieżdżonym wyrażeniu XPath (część w nawiasach kwadratowych). Tam odnosi się do dowolnego węzła, który jest obecnie testowany pod kątem dopasowania. Dlatego węzeł kontekstowy zmienia się w wyrażeniu XPath, ale nie w bieżącym węźle.

Węzeł kontekstowy może być skrócony kropką (.) lub czasami całkowicie pominięty. To jest to prawdopodobnie nieco mylące, ponieważ poza zagnieżdżonym wyrażeniem kropka oznacza bieżący węzeł. (W takim przypadku obecny węzeł jest węzłem kontekstowym, więc można powiedzieć, że jest to aktualny węzeł tylko bliższy i jest bardziej poprawnie nazywany węzłem kontekstowym. Ale nawet spec nazywa go obecnym węzłem tutaj.)

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

Rozróżnienie tych dwóch jest przydatne w niektórych przypadkach. Na przykład, załóżmy, że masz jakiś XML w ten sposób:

<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 na LaTeX w następujący sposób:

foo\footnote{Batteries not included.}
bar

baz
aak\footnote{Some assembly required.}

eep
blech\footnotemark[2]

Sztuczka polega na tym, czy przypis został już użyty, czy nie. Jeśli po raz pierwszy napotkałeś przypis, chcesz napisać polecenie \footnote; w przeciwnym razie chcesz napisać polecenie \footnotemark. Możesz użyć XSL kod podobny do tego:

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

Tutaj porównujemy atrybut context-node fn (z wyników preceding::* node-set) do atrybutu current-node fn. (Właściwie nie musisz mówić ./@fn; możesz po prostu powiedzieć @fn.)

Krótko mówiąc, węzeł kontekstowy 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.

 70
Author: Paul A Jungwirth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-20 19:30:09

Context Node

The węzeł kontekstowy jest częścią XPath kontekst oceny i zależy od każdego kroku lokalizacji :

step1 / step2 / step3 / ...

Gdzie każdy step jest

axis::node-test[predicate]
  • każdy krok jest oceniany w odniesieniu do węzłów kontekstu ustawionych przez poprzedzających kroków.
  • każdy krok wybiera węzły, które stają się węzłem kontekstowym dla następujących po kroków.
  • kiedy oceniając predicate, węzeł kontekstowy jest węzłem wzdłuż axis, który przeszedł node-test.
  • węzeł kontekstowy jest dostępny jako ..

Bieżący Węzeł

The aktualny węzeł () jest częścią XSLT model przetwarzania:1

  • bieżący węzeł jest węzłem w źródłowym dokumencie XML najlepiej dopasowanym do szablonu XSLT.
  • bieżący węzeł staje się kontekstem początkowym węzeł dla każdego wyrażenia XPath w dopasowanym szablonie.
  • bieżący węzeł może być dostępny jako current() w predykatach XPath.

1chociaż nie ma znaczenia dla zrozumienia podstawowej różnicy między węzłem kontekstowym a węzłem bieżącym, zauważ, że W XSLT 2.0 zmieniono opis kontekstu oceny. Pojęcia bieżącego węzła i bieżącej listy węzłów zostały zastąpione pojęciami XPath pozycja kontekstowa, położenie kontekstu i rozmiar kontekstu.

 1
Author: kjhughes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-03 14:13:29