我正在尝试使用xsl / xslt从以下xml中删除属性xmlns="http://webdev2003.test.com"
,这是SSIS中XML任务的要求。考虑到大文件大小,什么是正确的方法。 〜40MB
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfAccount xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Account>
<FirstName xmlns="http://webdev2003.test.com/">John</FirstName>
<LastName xmlns="http://webdev2003.test.com/">Smith</LastName>
</Account>
</ArrayOfAccount>
答案 0 :(得分:3)
我讨厌回答自己的问题,但归功于 - http://blogs.msdn.com/kaevans/archive/2003/06/13/8679.aspx
该示例的第一部分列出了如何删除我的场景中的所有属性。也许有更好的解决方案?
答案 1 :(得分:1)
我认为你可以删除this article中描述的命名空间声明。看起来您可能必须在样式表中声明命名空间的前缀,然后再将其添加到exclude-result-prefixes属性。
您可以使用xsl:stylesheet元素的exclude-result-prefixes属性来防止这种情况发生。此属性的名称可能会令人困惑,因为名称空间前缀仍将显示在结果树中。它并不意味着“排除结果中的前缀”;它的意思是“用这些前缀排除名称空间”。
答案 2 :(得分:0)
怎么样?
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates select="attribute::*"/>
<xsl:if test="namespace-uri()!='http://webdev2003.test.com/' and
namespace-uri()!=''">
<xsl:attribute name="xmlns">
<xsl:value-of select="namespace-uri()"/>
</xsl:attribute>
</xsl:if>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>