Обнаружение, если узел существует? - PullRequest
4 голосов
/ 09 февраля 2011

У меня есть набор данных, называемый <testData> со многими узлами внутри.

Как определить, существует узел или нет?

Я пробовал

<xsl:if test="/testData">

и

<xsl:if test="../testData">

Ни одна из них не работает.Я уверен, что это возможно, но я не уверен, как.: P

Для контекста XML-файл выглядит так:

<overall>
 <body/>
 <state/>
 <data/>(the one I want access to
 </overall>

В данный момент я нахожусь в теге <body>, хотя я бы хотел получить к нему глобальный доступ.Разве /overall/data не должен работать?

Редактировать 2: Прямо сейчас у меня есть индекс данных, который мне нужно использовать в любое время, когда я применяю шаблоны к тегам внутри тела.Как мне сказать, в то время как в теле, что данные существуют?Иногда это так, иногда нет.Не могу реально контролировать это.:)

Ответы [ 3 ]

8 голосов
/ 09 февраля 2011

Попробуйте count(.//testdata) &gt; 0.

Однако, если ваш контекстный узел textdata и вы хотите проверить, имеет ли он somenode дочерний или нет, я бы написал:

  <xsl:if test="somenode"> 
    ...
  </xsl:if>

Но я думаю, что это не то, что вы на самом делехочу.Я думаю, вы должны прочитать о различных методах написания таблиц стилей XSLT (обработка push / pull и т. Д.).При их применении такие выражения обычно не нужны, и таблицы стилей становятся проще.

3 голосов
/ 13 апреля 2016

Это будет работать с XSL 1.0, если кому-то нужно ...

<xsl:choose>
    <xsl:when test="/testdata">node exists</xsl:when>
    <xsl:otherwise>node does not exists</xsl:otherwise>
</xsl:choose>
3 голосов
/ 09 февраля 2011

Этот XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="text()"/> <!-- for clarity only -->
    <xsl:template match="body">
        <xsl:if test="following-sibling::data">
            <xsl:text>Data occurs</xsl:text>
        </xsl:if>
        <xsl:if test="not(following-sibling::data)">
            <xsl:text>No Data occurs</xsl:text>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

Применительно к этому образцу:

<overall>
    <body/>
    <state/>
    <data/>(the one I want access to
</overall>

Даст правильный результат:

Data occurs

При применении к этому образцу

<overall>
    <body/>
    <state/>
</overall>

Результат будет:

No Data occurs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...