xsl检查根节点是否包含任何子节点

时间:2017-01-04 23:18:43

标签: xslt dotnetnuke

有没有办法确定根级节点是否包含任何子节点? 我有这个代码文件为下拉菜单构建导航菜单,但是对于没有节点的根节点,我想对它们应用不同的模板:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/>
    <xsl:template match="/Home">
        <xsl:apply-templates select="root" />
    </xsl:template>

    <xsl:template match="root">

        <ul class="nav navbar-nav">
            <xsl:apply-templates select="node">
                <xsl:with-param name="level" select="0"/>
            </xsl:apply-templates>
        </ul>

    </xsl:template>


    <xsl:template match="node">
        <xsl:param name="level" />
        <xsl:choose>
            <xsl:when test="$level=0">
                <li>
                    <xsl:attribute name="class">
                        <xsl:if test="@breadcrumb = 1">active</xsl:if>
                        <xsl:if test="node">
                            <xsl:text>&#32;dropdown</xsl:text>
                        </xsl:if>


                    </xsl:attribute>
                    <xsl:choose>
                        <xsl:when test="@enabled = 1">
                           <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                                <xsl:attribute name="class">
                                    <xsl:if test="node">
                                        <xsl:text>dropdown-toggle</xsl:text>
                                    </xsl:if>
                                </xsl:attribute>
                                <xsl:if test="node">
                                    <xsl:attribute name="data-toggle">dropdown</xsl:attribute>
                                </xsl:if>
                                <xsl:value-of select="@text" />
                                <xsl:if test="node">
                                    <b class="caret"></b>
                                </xsl:if>
                            </a>
                        </xsl:when>
                        <xsl:otherwise>

                            <xsl:value-of select="@text" />

                        </xsl:otherwise>
                    </xsl:choose>
                    <xsl:if test="node">
                        <ul class="dropdown-menu">
                            <xsl:apply-templates select="node">
                                <xsl:with-param name="level" select="$level + 1" />
                            </xsl:apply-templates>
                        </ul>
                    </xsl:if>
                </li>
            </xsl:when>
            <xsl:otherwise>
                <li>
                    <xsl:attribute name="class">
                        <xsl:if test="@breadcrumb = 1">active</xsl:if>
                        <xsl:if test="node">
                            <xsl:text>&#32;dropdown</xsl:text>
                        </xsl:if>
                    </xsl:attribute>
                    <xsl:choose>
                        <xsl:when test="@enabled = 1">
                            <a href="{@url}">
                                <xsl:value-of select="@text" />
                            </a>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="@text" />
                        </xsl:otherwise>
                    </xsl:choose>
                </li>
                <xsl:if test="node">
                    <!-- no extra level in default bootstrap -->
                </xsl:if>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

3 个答案:

答案 0 :(得分:3)

你的问题不明确。如果根节点没有任何子节点,则XML文档为空。也许你的意思是根元素;将会有一个这样的元素,通过使用它很容易看出它是否有任何子节点:

test="/*/node()"

xsl:ifxsl:when指令中。

或者,您可以使用两个模板 - 一个匹配根元素与子节点:

<xsl:template match="/*[node()]">

和另一个案例:

<xsl:template match="/*[not(node())]">

答案 1 :(得分:0)

您可以使用此XSLT文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" />

    <xsl:template match="/*[count(descendant::*) = 0]">
      No siblings
    </xsl:template>

    <xsl:template match="/*[count(descendant::*) > 0]">
      Has siblings
    </xsl:template>

</xsl:stylesheet>

使用带有一个或多个根元素兄弟的输入XML文件,如

<?xml version="1.0"?>
<root>
  <a />
</root>

它将输出“有兄弟姐妹”。

输入文件的空根标签就像这样

<?xml version="1.0"?>
<root>
</root>

它将输出“没有兄弟姐妹”。

答案 2 :(得分:0)

如果我正确理解了问题,请尝试添加模板规则

<xsl:template match="root[not(*)]"/>