Xslt 排除空元素

Xslt 排除空元素,xslt,xslt-2.0,Xslt,Xslt 2.0,在示例xml文件中,我有以下内容: <AAA mandatory = "true"> good </AAA> <BBB mandatory = "true"></BBB> <CCC /> 很好 在生成的xml中,结果应如下所示: <AAA> good </AAA> <BBB></BBB> 很好 我应该在转换文件xslt中放入什么来生成此xml 目前,我有: <xsl:temp

在示例xml文件中,我有以下内容:

<AAA mandatory = "true"> good </AAA>
<BBB mandatory = "true"></BBB>
<CCC />
很好
在生成的xml中,结果应如下所示:

<AAA> good </AAA>
<BBB></BBB>
很好
我应该在转换文件xslt中放入什么来生成此xml

目前,我有:

<xsl:template match="node()[(@mandatory='true' or (following-sibling::*[@mandatory='true' and string-length(normalize-space(.)) > 0] or preceding-sibling::*[@mandatory='true' and string-length(normalize-space(.)) > 0])) or descendant-or-self::*[string-length(normalize-space(.)) > 0]]">

但这一直在显示

 <CCC />

在输入XML上运行XSLT时,不会得到任何输出。 您提供的XML格式不正确,我认为“匹配”中的XPATH太复杂

我提出了一个XSL1.0解决方案,但我不知道您是否可以在XSL2.0中使用它。我没有使用XSL2.0的经验

此XSLT:

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

<xsl:template match="/">
    <list>
        <xsl:apply-templates/>
    </list>
</xsl:template>

<xsl:template match="*[@mandatory='true']">
    <xsl:copy>
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

应用于此输入XML:

<?xml version="1.0" encoding="UTF-8"?>
<list>
<AAA mandatory="true"> good </AAA>
<BBB mandatory="true"/>
<CCC/>
</list>
提供以下输出XML:

<?xml version="1.0" encoding="UTF-8"?>
<list>
<AAA> good </AAA>
<BBB/>
</list>
我希望这有点帮助。我不确定您是否还要检查元素的文本长度,还是只检查属性mandatory。我只检查XSL中的属性

致以最良好的祝愿,
Peter

那么这里哪一个删除了非强制的空节点?创建元素来包装输出。仅与@mandatory='true'匹配,并复制节点+文本。因此,不会复制所有不具有该属性的节点。它们只是剩下的。因此不需要“删除命令”。