我想删除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>
答案 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
元素下(或根本不在命名空间中),那么这些元素也会被删除。