xslt删除xml中的所有属性

时间:2019-02-04 07:02:37

标签: xml xslt

我有以下示例XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<type>
<subtype id="1">
    <Shoebox>
        <author index="0">BUILTIN\Administrators</author>
        <dateModified index="0">2001-02-23T11:30:38.000
        </dateModified>
        <title index="0">false</title>
        <sourceLocation index="0">\\vms2\TestData\Filesystem\1 
                     doc
        </sourceLocation>
        <keywords index="0">doc1</keywords>
        <contentSize index="0">123</contentSize>
        <department index="0">Windows 7</department>
        <fileName index="0">doc1.docx</fileName>
        <dateCreated index="0">2001-02- 
23T11:30:38.000</dateCreated>
        <format index="0">docx</format>
    </Shoebox>      
</subtype>  
</type>    

下面是我的xslt

 <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns="urn:philips:en:xsd:Trailbalance.1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" omit-xml-declaration="no"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="node()">
        <xsl:copy>
      <xsl:apply-templates />
    </xsl:copy>
    </xsl:template>
    <xsl:template match="type">
        <xsl:element name="trackwise">
            <xsl:apply-templates select="subtype"/>
        </xsl:element>  
    </xsl:template>
        <xsl:template match="subtype">      
        <xsl:for-each select="Shoebox">      
        <capa>      
          <xsl:copy-of select="node()" />
        </capa>
        </xsl:for-each>
        </xsl:template>

期望xml如下

<?xml version="1.0" encoding="UTF-8"?>
<trackwise>
<capa>
<author>BUILTIN\Administrators</author>
<dateModified>2001-02-23T11:30:38.000           </dateModified>
  <title>false</title>
<sourceLocation>\\vms2\TestData\Filesystem\1 doc    </sourceLocation>
<keywords>doc1</keywords>
<contentSize >123</contentSize>
<department>Windows 7</department>
<fileName>doc1.docx</fileName>
<dateCreated >2001-02-23T11:30:38.000</dateCreated>
<format>docx</format>
</capa>
</trackwise>

xslt上面的问题是还复制了属性“ index”,我想从所有子节点中删除“ index”属性,在xslt上面我在做什么错了。

3 个答案:

答案 0 :(得分:1)

如果要删除所有属性,请使用:

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

请参阅链接:http://xsltransform.net/nbiCsYY

AND

如果要删除所有index属性,请使用:

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

    <xsl:template match="@index"/>

查看链接:http://xsltransform.net/nbiCsYY/2

答案 1 :(得分:0)

首先,构建一个身份模板:

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

如果要删除所有@index属性,可以使用

<xsl:template match="@index"/>

此外,您也可以使用直接模板匹配来获取所需结果,而不是逐个进行

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

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

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

整个样式表如下:

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

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

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

    <xsl:template match="@index"/>

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

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

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

</xsl:stylesheet>

答案 2 :(得分:-1)

<capa>      
<xsl:apply-templates select="node()"/>
</capa>
use apply-template instead of copy-of element