使用xslt防止向复制元素添加xmlns =“”

时间:2014-08-19 07:18:42

标签: xml xslt

我有一个XML文件,我希望使用XSLT复制一些元素,但是它添加了xmlns =" "在复制元素中。

XSLT

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:x="http://www.example.com/rsd/DataAccess" 
  exclude-result-prefixes="x"
>
  <xsl:output method="xml" indent="yes"/>

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

  <xsl:template match="x:Adapter[@Key='AuditLogging']">
    <xsl:copy-of select="."/>
    <Adapter Key="AutoExport"></Adapter>
  </xsl:template>
</xsl:stylesheet>

XML

 <Adapters xmlns="http://www.example.com/rsd/DataAccess">
   <Adapter Key="LASTCHANGEDATE" />
   <Adapter Key="AuditLogging" />
 </Adapters>

输出XML

<Adapters xmlns="http://www.example.com/rsd/DataAccess">
   <Adapter Key="LASTCHANGEDATE" />
   <Adapter Key="AuditLogging" />
   <Adapter Key="AutoExport" xmlns="" />
</Adapters>

如何防止添加xmlns =&#34; &#34;在元素中。

2 个答案:

答案 0 :(得分:1)

这是因为在您的输入XML中,所有元素都属于命名空间

<Adapters xmlns="http://www.example.com/rsd/DataAccess">

但是,当您在模板中创建新的Adapter元素时,就像这样......

<Adapter Key="AutoExport">

您实际上是在创建一个不属于任何名称空间的新元素,因此输出中会显示xmlns=''来表明这一点。

一种解决方案是在XSLT中声明一个默认命名空间,这样您在XSLT中创建的任何未加前缀的元素都将成为此命名空间的一部分。

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
  xmlns:x="http://www.example.com/rsd/DataAccess"  
  xmlns="http://www.example.com/rsd/DataAccess" exclude-result-prefixes="x">

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

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

<xsl:template match="x:Adapter[@Key='AuditLogging']">
   <xsl:copy-of select="."/>
    <Adapter Key="AutoExport" />
 </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

问题是在XSL下面的声明

<xsl:template match="x:Adapter[@Key='AuditLogging']">
   <xsl:copy-of select="."/>
    <Adapter Key="AutoExport">
    </Adapter>
 </xsl:template>

不同 xml命名空间中创建新元素而不是根元素(已定义xmlns="http://www.example.com/rsd/DataAccess"

最简单的方法是在新元素中声明适当的命名空间,但并非所有XSL编译器都会将其删除。

您也可以尝试Define a default namespace for use in XSL XPaths with xpath-default-namespace中的建议,但我不知道正在使用哪个版本