XSLT 中名称空间的单一定义

Single definition of a namespace in XSLT

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

我只想定义一次。

动态使用是这样的:

<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>

这最终用于在 element 标签上设置 namespace,然后作为函数结果返回。 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">

但是根据这个post: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'])"/>

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

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

想到的唯一解决方案是使用 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 实体的忠实粉丝,但有些人发誓他们...