清除XSL中的所有文本元素

时间:2017-12-15 19:20:04

标签: xml xslt

某人有解决方案。 我有一个完全填充测试数据的XML。我需要清除所有元素文本。

<xml>
    <parent>
        <child>A</child>
        <child>B</child>
        <pet>
            <dog>C</dog>
            <cat>D</cat>
        </pet>
    </parent>
</xml>

需要成为

<xml>
    <parent>
        <child></child>
        <child></child>
        <pet>
            <dog></dog>
            <cat></cat>
        </pet>
    </parent>
</xml>

我的真实XML包含100多个不同的元素名称,所以我需要一个通用的方法。

我正在尝试使用身份转换的变体,但我遇到了XSL错误。

  

文件错误:cleanxml.xsl   -2147467259要创建“ELEMENT”类型的节点,必须指定有效名称。

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match='/|@*|node()'>
    <!--
    Regular Identity Transform
    <xsl:copy>
        <xsl:apply-templates select='@*|node()'/>
    </xsl:copy>
    -->
    <xsl:variable name='name' select='local-name()'/>

    <xsl:element name='{$name}'>
        <xsl:apply-templates select='@*|node()'/>
    </xsl:element>

</xsl:template>

</xsl:stylesheet>

2 个答案:

答案 0 :(得分:1)

使用此xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

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

<xsl:template match="text()" />

</xsl:stylesheet>

答案 1 :(得分:0)

您需要从身份转换开始,然后添加

  <xsl:template match="text()[normalize-space()]"/>

所以你需要的是XSLT 3(http://xsltfiddle.liberty-development.net/gWcDMec

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="text()[normalize-space()]"/>

</xsl:stylesheet>

或者对于早期版本,您需要将身份转换拼写为

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

而不是使用xsl:mode