xslt转换以删除元素

时间:2015-01-20 06:25:48

标签: c# xml xslt transformation

我想删除xml下面的所有条目,其中包含" tig:"在里面。我尝试了下面的转换xsl来转换它,它不起作用。

 <ContactInfo>
    <PersonName>
        <FormattedName>My Name</FormattedName>
        <GivenName>Test first Name</GivenName>
        <FamilyName>Test Last Name</FamilyName>
    </PersonName>
       </ContactInfo>
    <tig:TestArea>
        <tig:UserArea>
            <tig:ParseTime>9000</tig:ParseTime>
        </tig:UserArea>
        <tig:Country>
            <tig:Language>en</tig:Language>
        <tig:Country>CAN</tig:Country>
        </tig:Country>
    </tig : TestArea>

我尝试了以下转换xsl来转换它并且它不起作用。 tig:也是一个命名空间,我想删除与该命名空间相关的所有元素。

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

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

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

    </xsl:stylesheet>

3 个答案:

答案 0 :(得分:1)

而不是

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

使用

<xsl:template match="tig:"/>

答案 1 :(得分:1)

给出格式良好的输入,例如:

<root>
    <ContactInfo>
        <PersonName>
            <FormattedName>My Name</FormattedName>
            <GivenName>Test first Name</GivenName>
            <FamilyName>Test Last Name</FamilyName>
        </PersonName>
    </ContactInfo>
    <tig:TestArea xmlns:tig="http://www.example.com/tig">
            <tig:UserArea>
                <tig:ParseTime>9000</tig:ParseTime>
            </tig:UserArea>
            <tig:Language>en</tig:Language>
            <tig:Country>CAN</tig:Country>
    </tig:TestArea>
</root>

以下样式表:

XSLT 1.0

<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="*"/>

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

<xsl:template match="tig:*" xmlns:tig="http://www.example.com/tig"/>

</xsl:stylesheet>

将删除绑定到tig前缀的名称空间中的所有元素(及其后代),从而导致:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <ContactInfo>
      <PersonName>
         <FormattedName>My Name</FormattedName>
         <GivenName>Test first Name</GivenName>
         <FamilyName>Test Last Name</FamilyName>
      </PersonName>
   </ContactInfo>
</root>

答案 2 :(得分:0)

首先要说的是你的XML缺少“tig”前缀的名称空间声明。它也缺少单个根元素,所以我假设你的实际XML中有一个根元素,其中声明了命名空间

<Data xmlns:tig="http://tig">
   <ContactInfo>

您还需要在XSLT中声明命名空间

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

但是在回答你的问题时,它不起作用的原因(更有可能是你收到错误信息)是语法应该是这个

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

请注意,这会删除(或者更确切地说,不输出)元素,但它会继续处理其子元素,这最终会导致输出文本节点(例如“en”和“CAN”)。要停止此操作,您可能还需要添加以下模板

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

试试这个XSLT

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

    <xsl:output method="xml" indent="yes"/>

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

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

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

注意,您可以使用以下匹配模板替换两个tig模板

<xsl:template match="tig:*" />

但是,如果你的元素嵌套在属于不同命名空间的tig元素下(或根本不在命名空间中),那么这些元素也会被删除。