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 实体的忠实粉丝,但有些人发誓他们...
我有一个动态和静态使用的命名空间。
我只想定义一次。
动态使用是这样的:
<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 实体的忠实粉丝,但有些人发誓他们...