XSL: проверить, есть ли только один дочерний узел - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть XML -код, который выглядит следующим образом:

<l>
    some text <app><rdg>text inside an app</rdg></app>
</l>
<l>
    <app><rdg>line with text inside an app</rdg></app>
</l>

Я хочу обработать XML с помощью XSLT и добавить к выводу различные атрибуты, в зависимости от:

  1. Если строка содержит текст и <app> и <rdg> с текстом в нем
  2. Если строка содержит только текст, то это внутри <rdg> -Элемента

Я попробовал следующее решение, которое не работает для меня:

<xsl:for-each select="l">
        <xsl:choose>
            <xsl:when test="app/rdg">
                <myElement>
                    <xsl:attribute name="class" select="'case1'"/>
                </myElement>
            </xsl:when>
            <xsl:when
                test="app/rdg[not(../following-sibling::*) and 
    not(../preceding-sibling::*)]">
                <myElement>
                    <xsl:attribute name="class" select="'case2'"/>
                </myElement>
            </xsl:when>
        </xsl:choose>
    </xsl:for-each>

Есть ли способ различить guish эти два (или, конечно, даже больше) случая?

1 Ответ

1 голос
/ 13 февраля 2020

Ваше первое условие

Если строка содержит текст и <app> и <rdg> с текстом в нем

Это соответствует этому выражению XPath:

text() and app[rdg]

Ваше второе условие

Если строка содержит только текст, то находится внутри <rdg> -элемента

Это равно выражению XPath:

not(.//text()[not(parent::rdg)])

Все это в контексте l элемент.

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