【问题标题】:Single definition of a namespace in XSLTXSLT 中命名空间的单一定义
【发布时间】:2018-05-24 16:49:32
【问题描述】:

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

我只想定义一次。

动态使用是这样的:

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

但是根据这篇文章: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

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

【问题讨论】:

    标签: xml xslt xslt-3.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 实体的忠实粉丝,但有些人对它们发誓...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 2011-12-18
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多