xslt仅为根节点定义命名空间

时间:2015-03-06 17:39:09

标签: xml xslt

我正在编写一个xslt来将一个filemaker xml导出转换为另一个系统。我想添加一个根节点,并为其定义名称空间:

<xsl:template match="*">
  <root xmlns="http://somedefinition">
    <xsl:apply-templates select="fm:ROW" />
  </root>
</xsl:template>

<xsl:template match="fm:ROW">
 <name><xsl:value-of select="fm:name"/></name>
 <name2><xsl:value-of select="fm:name2" /></name2>
 <street><xsl:value-of select="fm:street" /></street>
</xsl:template>

我打电话给另一个模板。由该模板创建的节点也获得xmln定义,该定义为空。我该如何防止这种情况?

输出看起来像这样:

<root xmlns="http://somedefinition">
  <name xmlns="">Lack AG</name>
  <name2 xmlns="">Freie Strasse</name2>
  <street xmlns="">55</street>
</root>

thx求助

1 个答案:

答案 0 :(得分:2)

该输出是正确的,因为您在root命名空间中创建了一个http://somedefinition元素,在 no 命名空间中创建了许多其他元素。要准确地序列化,处理器必须添加xmlns=""覆盖。

要获得所需的输出,您需要在与name元素相同的name2命名空间中创建streethttp://somedefinitionroot元素。实现这一目标的最简单方法是从第一个模板中的xmlns="http://somedefinition"元素中删除root,而不是将其放在样式表文档根目录的xsl:stylesheet元素上

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
       xmlns:fm="..."
       xmlns="http://somedefinition"><!-- and any other required namespaces -->

  <xsl:template match="*">
    <root>
      <xsl:apply-templates select="fm:ROW" />
    </root>
  </xsl:template>

  <xsl:template match="fm:ROW">
   <name><xsl:value-of select="fm:name"/></name>
   <name2><xsl:value-of select="fm:name2" /></name2>
   <street><xsl:value-of select="fm:street" /></street>
  </xsl:template>
</xsl:stylesheet>

现在样式表中所有未加前缀的文字结果元素都使用xmlns="...."xsl:stylesheet中声明的名称空间,它们将在输出树中的正确名称空间中创建。当序列化程序将该树写为XML时,它可以通过仅在xmlns="..."元素上放置root来实现。