XSLT中命名空间的单一定义

时间:2018-05-24 16:49:32

标签: xml xslt xslt-3.0

我有一个动态和静态使用的命名空间。

我只想定义一次。

动态使用是这样的:

<xsl:variable name="fpml-ns" select="'http://www.fpml.org/2005/FpML-4-2'"/>
<xsl:function name="qt:some-function">
    <xsl:param name="pd"/>
    <xsl:sequence select="qt:other-function($fpml-ns, $pd)"/>
</xsl:function>

这最终用于在namespace标记上设置element,然后将其作为函数结果返回。 other-function可以与许多名称空间一起使用,因此它是动态的。

在同一个XSLT文件中,静态使用是这样的 - 命名空间仅适用于XSLT中的特定结果文档:

<SWBML xmlns="http://www.fpml.org/2005/FpML-4-2" xsl:use-attribute-sets="swbml.ir">

因此字符串“http://www.fpml.org/2005/FpML-4-2”在我的XSLT文件中出现两次 - 虽然不是灾难但我发现重复次优。

我也尝试使SWBML元素动态化,即:

<element name="SWBML" namespace="${fpml-ns}" use-attribute-sets="swbml.ir">

但是根据这篇文章:How can I dynamically set the default namespace declaration of an XSLT transformation's output XML?

子项不会像使用静态定义那样继承动态名称空间。

我已经考虑过引用当前文档的相当丑陋的解决方法,并且如此阅读:

<xsl:variable name="fpml-ns" select="namespace-uri(document('')//node()[local-name()='SWBML'])"/>

这可行,但在尝试对输入进行模式感知评估时会导致问题,因为当前文档会使用导致此问题的结果的命名空间进行验证 - Saxon Prematurely Evalutes xsl:attribute-set

是否有一种明智的方法来实现命名空间的单一定义,然后我可以静态地和动态地引用它?

1 个答案:

答案 0 :(得分:1)

想到的唯一解决方案是使用XML实体:

<!DOCTYPE xsl:stylesheet [
  <!ENTITY ns "http://www.fpml.org/2005/FpML-4-2">
]>

....

<SWBML xmlns="&ns;" xsl:use-attribute-sets="swbml.ir">

....

<xsl:variable name="fpml-ns" select="'&ns;'"/>

我不是XML实体的忠实拥护者,但是有些人向他们发誓...