名称空间声明问题

时间:2014-03-19 02:56:55

标签: xml xslt namespaces xslt-1.0

我正在尝试从已转换的xml中删除名称空间声明

请到这里:http://xslttest.appspot.com/

输入xml:

<Products xmlns="http://api.company.com.au/Data" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Product>
<Code>BM54</Code>
</Product>
</Products>

xslt模板

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:d="http://api.company.com.au/Data" exclude-result-prefixes="d">
  <xsl:output method="xml" omit-xml-declaration="yes"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="d:Product">
        <DONE>
            <xsl:apply-templates select="@* | node()"/>
        </DONE>
    </xsl:template>
    <xsl:template match="@Product">
        <xsl:attribute name="DONE">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

结果是:

<Products xmlns="http://api.company.com.au/Data" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<DONE xmlns="">
<Code xmlns="http://api.company.com.au/Data">BM54</Code>
</DONE>
</Products>

我希望它是:

<Products xmlns="http://api.company.com.au/Data" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<DONE>
<Code>BM54</Code>
</DONE>
</Products>

2 个答案:

答案 0 :(得分:2)

只需更改

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

<xsl:template match="d:Product">
    <xsl:element name="DONE" namespace="http://api.company.com.au/Data">
        <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
</xsl:template>

答案 1 :(得分:1)

如果要在默认命名空间中创建元素,则更改解决方案是预先声明:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:d="http://api.example.com.au/Data"
     xmlns="http://api.example.com.au/Data" 
     exclude-result-prefixes="d">
<!--  rest of the document -->

这使得d空命名空间的简写都对应于http://api.company.com.au/Data这就是你想要的,即使它不是你问的

然后你可以使用原始代码:

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

正如keshlam指出的那样,这是因为你将它放在与文档其余部分相同的命名空间中。