使用xslt进行转换时的命名空间问题

时间:2014-04-08 13:49:42

标签: xml xslt

我正在进行XML转换,并在添加命名空间时遇到有线问题。下面是我的XML和XSL。问题是我转换的XML附加命名空间属性(xmlns ="")来阐述我不想要的。感谢您的帮助

输入XML

  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Catalog>
    <Books>
        <book1>Wise Otherwise</book1>
        <book2>Great Expectations</book2>
    </Books>
    <library>
        <Name> Forsyth </Name>
        <city> Cumming </city>
    </library>  
</Catalog>

预期结果

<?xml version="1.0" encoding="UTF-8"?>
<Import xmlns="http://example.com" ImportType="BASE">
   <Books>
      <book1>Wise Otherwise</book1>
      <book2>Great Expectations</book2>
   </Books>
   <elab>
      <Name> Forsyth </Name>
      <city> Cumming </city>
   </elab>
</Import>

以下是我的XSL

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space  elements="*"/>   
<xsl:template match="@* | node()">
   <xsl:copy>
     <xsl:apply-templates select="@* | node()"/>
   </xsl:copy>
</xsl:template>

<xsl:template match="library">
    <elab>
        <xsl:apply-templates />
    </elab>
 </xsl:template>

 <xsl:template match="Catalog">
    <Import xmlns="http://example.com" ImportType="BASE">
        <xsl:apply-templates />
    </Import>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

这是因为您的模板匹配library会在无命名空间中创建elab元素,因此序列化程序必须添加xmlns=""以准确地序列化生成的树。如果您将xmlns="http://example.com"移到xsl:stylesheet元素,那么样式表中的所有无前缀文字结果元素都将位于此命名空间中,您将获得结果你需要:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://example.com" >
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space  elements="*"/>   
<xsl:template match="@* | node()">
   <xsl:copy>
     <xsl:apply-templates select="@* | node()"/>
   </xsl:copy>
</xsl:template>

<xsl:template match="library">
    <elab>
        <xsl:apply-templates />
    </elab>
 </xsl:template>

 <xsl:template match="Catalog">
    <Import ImportType="BASE">
        <xsl:apply-templates />
    </Import>
</xsl:template>
</xsl:stylesheet>

这里更普遍的一点是,当您使用XSLT(或任何名称空间感知的XML工具)时,不要考虑xmlns&#34;属性&#34; < sup> 1 而是考虑在正确的命名空间中创建元素以开始,命名空间绑定将自行处理。

1:我称之为&#34;属性&#34;在引号中,因为就XML数据模型而言,它们实际上并不属于属性,您无法像对待它们一样操纵它们