XSLT-检查子节点是否有价值

时间:2018-11-01 08:32:47

标签: xml xslt xpath

我以以下格式输入了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 :(得分:1)

您需要执行以下代码:

<?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>

答案 1 :(得分:0)

假设您处于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文档中。