Aktualizacja:Ta odpowiedź dotyczy wymagania określonego w oryginalnym tytule pytania: "ustalenie, czy ostatni węzeł podrzędny jest węzłem tekstowym." Ale ciało pytania sugeruje inny wymóg i wydaje się, że ten ostatni wymóg był tym, który jest zamierzony przez PO.
Dwie poprzednie odpowiedzi wyraźnie testują, czy ostatnie dziecko jest elementem bar
, zamiast bezpośrednio testować, czy jest to węzeł tekstowy. Jest to poprawne, jeśli foo zawiera tylko "węzły tekstu mieszanego i elementy prętów" i nigdy nie ma zerowych potomków.
Ale może chcesz przetestować bezpośrednio czy ostatnie dziecko jest węzłem text:
- Dla czytelności logiki stylesheet
- W przypadku element zawiera inne dzieci oprócz elementów i tekstu: np komentarze lub instrukcje przetwarzania
- W przypadku element nie ma dzieci
Może wiesz dwa ostatnie nigdy nie pojawią się w twoim przypadku (ale z pytaniem chciałbym domyślać, że nr 3 mógł). A może tak myślisz, ale nie jesteś pewien, a może nie myślałeś o tym. W obu przypadkach jest to bezpieczniejsze przetestować bezpośrednio na to, co rzeczywiście chcesz wiedzieć:
test="node()[last()]/self::text()"
Tak więc, opierając się na @ przykładowym kodem Dimitre i wejścia następujące wejścia XML:
<root>
<foo>some text <bar/> and maybe some more</foo>
<foo>some text <bar/> and a pi: <?foopi param=yes?></foo>
<foo>some text <bar/> and a comment: <!-- baz --></foo>
<foo>some text and an element: <bar /></foo>
<foo noChildren="true" />
</root>
Dzięki tej XSLT szablon:
<xsl:template match="foo">
<xsl:choose>
<xsl:when test="node()[last()]/self::text()">
<xsl:text>text at the end; </xsl:text>
</xsl:when>
<xsl:when test="node()[last()]/self::*">
<xsl:text>element at the end; </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>neither text nor element child at the end; </xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
plony:
text at the end;
neither text nor element child at the end;
neither text nor element child at the end;
element at the end;
neither text nor element child at the end;
Dobre pytanie (+1). Zobacz moją odpowiedź na krótkie rozwiązanie i propozycję stylu pisania. :) –