使用XSLT删除包含和不包含现有属性的所有空XML元素

时间:2018-03-13 20:14:18

标签: xml xslt recursion

我需要在本地化后清理大型XML文件。不需要翻译的段被替换为占位符,然后在输出中被替换为空。然而,周围的标签仍然是复兴所有潜在的标签围绕那些现在丢失的内容似乎太复杂和肮脏。

当应用转换方案时,有许多空白表,行等,它们是已删除内容的剩余XML元素。不管他们是否有属性,我都需要所有那些空标签和空子。我能够找到以下解决方案,但它确实提到它只适用于没有属性的元素而不处理带子节点的元素(也是空的)。即使包含值的属性,它还需要对所有空元素进行哪些调整?任何想法都将不胜感激。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="*[descendant::text() or descendant-or-self::*/@*[string()]]">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="@*[string()]">
    <xsl:copy/>
</xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:3)

是否有必要切断字符串中的空格?

这里有normalize-space的例子: https://xsltfiddle.liberty-development.net/nbUY4kx/4

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="@*|node()">
          <xsl:if test="normalize-space(.)!=''">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>    
          </xsl:if>
    </xsl:template>
</xsl:stylesheet>

另一个例子没有: https://xsltfiddle.liberty-development.net/nbUY4kx/3