在XSLT中删除单个节点的属性

时间:2014-08-27 12:17:38

标签: xml xslt

这是我的XML源

<?xml version="1.0" encoding="UTF-8"?>
<tns:Grand_Parent_XML xmlns:tns="http://www.domain.com/">
  <GrandParent>
    <Parent>
        <Child xmlns:tns="http://www.domain.com/">
            <Age>3</Age>
            <Gender>Male</Gender>
            <Name>Todd</Name>
        </Child>
        <Other>1234</Other>
    </Parent>
  </GrandParent>
</tns:Grand_Parent_XML>

这是XSLT的主体,我正在使用......

<xsl:template match="node()|@*">
             <xsl:copy>
                    <xsl:apply-templates select="node()|@*"/>
             </xsl:copy>
       </xsl:template>
       <xsl:template match="Grand_Parent_XML">
             <xsl:element name="tns:{name()}" namespace="http://www.domain.com/">
                    <xsl:copy-of select="namespace::*"/>
                    <xsl:apply-templates select="node()|@*"/>
             </xsl:element>
       </xsl:template>

       <xsl:template match="node()|@*">
        <xsl:if test="normalize-space(string(.)) != ''">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
        </xsl:if>
        </xsl:template>

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

<xsl:template match="Child"/>

我想删除xmlns:tns =&#34;&#34;在Child上并将其保存在Grand_Parent_XML中。我在这里尝试了其他建议,比如在XSLT的底部创建以下代码,但它不起作用。任何帮助将不胜感激。

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

2 个答案:

答案 0 :(得分:1)

简单的身份转换删除了冗余的名称空间声明,仅此而已。测试了Saxon 6.5和9.5。

在编辑之前,您的XML输入有一个名称空间声明,如

xmlns:tns=""

请注意, undeclaring 命名空间在XML 1.0中是非法的,但在XML 1.1中是可能的。如果您已将文件的前导码更改为以下内容,则XML解析器不会引发错误:

<?xml version="1.1" encoding="UTF-8"?>

<强>样式表

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

    <xsl:strip-space elements="*"/>

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

</xsl:stylesheet>

XML输入

<?xml version="1.0" encoding="UTF-8"?>
<tns:Grand_Parent_XML xmlns:tns="http://www.domain.com/">
  <GrandParent>
    <Parent>
        <Child xmlns:tns="http://www.domain.com/">
            <Age>3</Age>
            <Gender>Male</Gender>
            <Name>Todd</Name>
        </Child>
        <Other>1234</Other>
    </Parent>
  </GrandParent>
</tns:Grand_Parent_XML>

XML输出

<?xml version="1.0" encoding="utf-8"?>
<tns:Grand_Parent_XML xmlns:tns="http://www.domain.com/">
   <GrandParent>
      <Parent>
         <Child>
            <Age>3</Age>
            <Gender>Male</Gender>
            <Name>Todd</Name>
         </Child>
         <Other>1234</Other>
      </Parent>
   </GrandParent>
</tns:Grand_Parent_XML>

答案 1 :(得分:0)

试试这个:

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

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

</xsl:stylesheet>