使用xsl从xml中删除xmlns命名空间

时间:2013-05-22 16:40:43

标签: xml xslt namespaces xml-namespaces

我有这个XML文档

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="data.xsl"?>
<products xmlns="http://zanox.com/productdata/exportservice/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://zanox.com/productdata/exportservice/v1 http://productdata.zanox.com/exportservice/schema/export-1.1.xsd">
<product>
    <name>BERTRAND BELIN+YANN DESTAL+D.RIVET</name>
    <program>3467</program>
</product>

我的XSL:

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

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

   <xsl:template match="product">
    <xsl:text>insert into data (name, program) values(</xsl:text>
    <xsl:value-of select="./name"/>
    <xsl:text>,'</xsl:text>
    <xsl:value-of select="./program"/>
    <xsl:text>'); </xsl:text>
   </xsl:template>

 </xsl:stylesheet>

但是这不起作用我需要从XML中的产品中删除xmlns命名空间。我不明白为什么omit-xml-declaration =“yes”不能完成这项工作?

1 个答案:

答案 0 :(得分:1)

要使xslt使用带有名称空间的xml文件,必须将名称空间声明添加到样式表中。 此外,默认名称空间(xml中没有pefix的名称空间)需要在xslt中有一个前缀。要使样式表起作用,请尝试以下方法:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:v1="http://zanox.com/productdata/exportservice/v1">
    <xsl:output method="text" omit-xml-declaration="yes"/>

    <xsl:template match="/">
        <xsl:apply-templates select="//v1:product"/>
    </xsl:template>

    <xsl:template match="v1:product">
        <xsl:text>insert into data (name, program) values(</xsl:text>
        <xsl:value-of select="./v1:name"/>
        <xsl:text>,'</xsl:text>
        <xsl:value-of select="./v1:program"/>
        <xsl:text>'); </xsl:text>
    </xsl:template>

</xsl:stylesheet>

xml声明是大多数xml文件中的第一行:

<?xml version="1.0"?>

omit-xml-declaration="yes"将“省略”。但只有xsl:output method="xml"才有意义。

以上xslt将生成以下输出:

insert into data (name, program) values(BERTRAND BELIN+YANN DESTAL+D.RIVET,'3467');