XSLT-проверка, имеет ли значение дочерний узел - PullRequest
0 голосов
/ 01 ноября 2018

Я ввел xml примерно в следующем формате.

<Root>
       <PAF>
         <Child1 xsi:nil="true" />
         <Child2 xsi:nil="true" />
         <Child3>BlahBlah</Child3>
       </PAF>
   </Root>

При преобразовании его в XML я хотел проверить если у <PAF> есть какой-либо ребенок, имеющий значение (в моем случае это <Child3>) тогда сделай что-нибудь Если у всех детей nil = "true" тогда сделай что-нибудь

Я немного новичок в написании сценариев XSLT. До сих пор я мог получить только количество дочерних узлов <PAF>. Может кто-нибудь предложить мне синтаксис if-else в моем контексте? Нужно ли здесь выражение XPATH?

Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вам нужно сделать ниже код:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xsi="www.nill.com"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="1.0">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="PAF">
        <xsl:choose>
            <!--Checked no data inside PAF and its descendants and not other attributes other than xsi:nill then Drop.--> 
            <xsl:when test="(count(descendant-or-self::*/@*[not(name() = 'xsi:nil')]) = 0) and (not(normalize-space()))"/>
            <xsl:otherwise>
                <xsl:copy>
                    <xsl:apply-templates select="@* | node()"/>
                </xsl:copy>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>
0 голосов
/ 01 ноября 2018

Предполагая, что вы находитесь в контексте PAX, вы могли бы что-то вроде:

<xsl:choose>
    <xsl:when test="*[not(@xsi:nil='true')]">
        <!-- not all chiLd nodes are empty -->
        <!-- DO SOMETHING HERE -->
    </xsl:when>
    <xsl:otherwise>
        <!-- all child nodes are empty -->
        <!-- DO SOMETHING ELSE -->
    </xsl:otherwise>
</xsl:choose>

Если ЧТО-ТО НЕ ЧТО-ТО, то используйте xsl:if вместо xsl:choose.


Обратите внимание, что объявление xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" должно присутствовать как в ваших XML, так и в XSLT документах.

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