Обновление: Этот ответ отвечает требованию, указанному в оригинальном заголовке вопроса: «выяснить, является ли последний дочерний узел текстовым узлом».Но тело вопроса предлагает другое требование, и кажется, что последнее требование было тем, которое было задано ФП.
Предыдущие два ответа явно проверяют, является ли последний дочерний элемент элементом bar
,вместо непосредственного тестирования, является ли это текстовым узлом.Это правильно, если foo содержит только «смешанные текстовые узлы и элементы панели» и никогда не имеют нулевых дочерних элементов.
Но вы можете напрямую проверить, является ли последний дочерний элементтекстовый узел:
- Для удобочитаемости логики таблицы стилей
- В случае, если элемент содержит другие дочерние элементы, кроме элементов и текста: например, комментарии или инструкции по обработке
- В случаеэлемент не имеет дочерних элементов
Возможно, вы знаете, что последние два никогда не появятся в вашем случае (но из вашего вопроса я бы предположил, что # 3 мог).Или, может быть, вы так думаете, но не уверены, или, может быть, вы не думали об этом.В любом случае безопаснее напрямую проверить то, что вы действительно хотите знать:
test="node()[last()]/self::text()"
Таким образом, основываясь на примере кода и ввода @ Dimitre, следующий 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>
С этим шаблоном XSLT:
<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>
выход:
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;