我正在编写一个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求助
答案 0 :(得分:2)
该输出是正确的,因为您在root
命名空间中创建了一个http://somedefinition
元素,在 no 命名空间中创建了许多其他元素。要准确地序列化,处理器必须添加xmlns=""
覆盖。
要获得所需的输出,您需要在与name
元素相同的name2
命名空间中创建street
,http://somedefinition
和root
元素。实现这一目标的最简单方法是从第一个模板中的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
来实现。