7

我创建了一个 XSLT 来处理特定的 xml 文档。但是,现在在我们的一些(但不是全部)文档中引入了命名空间。我想对这些文档使用相同的 XSLT,但是我无法将我的样式表修改为与名称空间无关。

之前有人建议将我的 xpaths 修改为*[local-name()="ElementName"],但是考虑到我们已经制作了样式表,这是非常耗费人力的。

此外,我知道我可以将 设置xpath-default-namespace为特定的命名空间,但如前所述,我不能简单地将其设置为 #all 或可能的命名空间列表。我正在寻找一个更有效的解决方案,并为我提供 Saxon 处理器的扩展功能。有任何想法吗?谢谢。

4

4 回答 4

3

您是否考虑过预处理您的 XML 文档?

您可以删除所有名称空间(注意可能的冲突),然后使用现有的 XSL 转换对其进行处理。

这种方法的优点是您根本不必修改 XSLT。它保持可读性(*[local-name()='frob'] 看起来很糟糕)并且可维护。

于 2009-02-04T18:22:26.017 回答
1

经过进一步咨询,似乎没有简单的方法可以解决这个问题。XSLT 必须重新设计为与名称空间无关,或者使用元素xpath-default-namespace上的属性。<xsl:stylesheet>如果我们希望保留传入文档的名称空间,但仍然有一个样式表与多个名称空间一起使用,那么我们的模板需要类似于以下形式:

<xsl:template match="*[local-name(.)='ElementName']">
   <xsl:element name="{local-name(.)}" xmlns="http://yourURIhere">
      <xsl:value-of select="."/>
   </xsl:element>
</xsl:template/>

等等

于 2009-02-03T19:17:05.110 回答
1

也许我不明白你的问题,但你不能让你的模板同时匹配空命名空间版本元素的命名空间版本吗?- 像这样:

<xsl:template match="ElementName | NS:ElementName" xmlns:NS="your-namespace">
   ... output ...
</xsl:template>

(通常,NS 前缀的声明将放在样式表元素上)

这是迄今为止对我来说最“干净”的版本——我已经使用它来让一个 XSLT 样式表处理所有三种 RSS 格式(0.91、1.0 和 2.0)。

于 2009-02-07T00:28:50.627 回答
0

我发现以下页面很好地呈现了问题,但没有给出解决方案:

http://www.edankert.com/defaultnamespaces.html

我在 O'Reilly "XML in a Nutshell" 中找到了该问题的解决方案:

http://docstore.mik.ua/orelly/xml/xmlnut/ch08_10.htm

于 2010-12-17T15:15:40.630 回答