【问题标题】:Treating empty document fragments as empty results将空文档片段视为空结果
【发布时间】:2013-05-19 04:47:31
【问题描述】:

将包含空文档片段的变量视为空变量的最干净的方法是什么?

我有以下代码

<xsl:variable name="embedded-examples" select="d:example"/>

<xsl:variable name="external-examples">
    <xsl:call-template name="external-examples"/>
</xsl:variable>

<xsl:variable name="examples" select="$embedded-examples | $external-examples"/>

<xsl:if test="$examples">
    <d:section>
        <d:title>
            <xsl:text>Examples</xsl:text>
        </d:title>

        <xsl:for-each select="$examples">
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </d:section>
</xsl:if>

还有模板

<xsl:template name="external-examples">
    <xsl:variable name="example-comments" select="$example-docs//comment()"/>

    <xsl:for-each select="$example-comments">
        <d:example>
            <d:title><xsl:value-of select="normalize-space(.)"/></d:title>
        </d:example>
    </xsl:for-each>
</xsl:template>

问题在于,当esternal-examples 中的变量为空时,xsl:for-each 循环不会运行,但无论如何它会产生一个空文档片段,从而使测试test="$examples" 通过而不是失败。

我应该在模板中做什么以确保当example-comments 为空时模板不返回任何内容?

【问题讨论】:

    标签: debugging xslt is-empty type-coercion documentfragment


    【解决方案1】:

    使用谓词检查子节点:

    <xsl:for-each select="$example-comments[count(child::node() ) &gt; 0]">
      ...
    </xsl:for-each>
    

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      相关资源
      最近更新 更多