【问题标题】:Inject namespace in XSLT在 XSLT 中注入命名空间
【发布时间】:2020-09-10 04:00:24
【问题描述】:

是否可以将命名空间注入到 XSLT 文档中,以便(例如)使用字符串的值来指定命名空间?我知道同样可以分别使用<xsl:attribute/> 和<xsl:element/> 构造来声明属性和元素(例如)。命名空间是否有类似的构造? 我要求这样做的原因是,我想构建一个 XSLT 转换,用于构建一个 XML 请求,该请求在许多接受相同 XML 结构的供应商中使用(除了它们应用不同的名称空间)。 我使用 Saxon XSLT 处理器。

【问题讨论】:

    标签: java xml xslt saxon


    【解决方案1】:

    在 XSLT 2.0 中使用 xsl:namespace 轻松完成。

    如果您真的需要在 XSLT 1.0 中执行此操作(为什么?),有一个曲折的解决方法:

    <xsl:variable name="temp">
      <xsl:element name="{$prefix}:dummy" namespace="{$uri}"/>
    </xsl:variable>
    <xsl:copy-of select="exsl:node-set($temp//*/namespace::*)"/>
    

    【讨论】:

    • 嗨,迈克尔,感谢您的回答。为了清楚起见,您能否举一个使用 xsl:namespace 的示例?我不确定它的语法是怎样的。
    • 规范中有几个例子:w3.org/TR/xslt-30/#element-namespace
    【解决方案2】:

    在 XSLT 2 及更高版本中,当然有 xsl:namespace (https://www.w3.org/TR/xslt-30/#creating-namespace-nodes),但我不确定它是否有助于处理来自不同名称空间的输入,例如 xsl:element,它会创建结果节点。 不要忘记xsl:element 和xsl:attribute 都允许您使用namespace 属性在不同的命名空间中构造结果节点。

    有*:foo 可以选择或匹配任何命名空间中的foo 元素。

    【讨论】:

    • 谢谢!我将不得不看看这是否是我最好的选择。通常我使用 XSLT 1.0,但显然您的建议不适合那里。你知道 xsl:attribute 构造是否可以用于声明命名空间吗?
    • @Birdie,你使用 Saxon 但 XSLT 1? Saxon 9 支持 XSLT 2 或自 9.8 起支持 XSLT 3。至于 xsl:attribute,命名空间声明不被视为 XSLT 数据模型中的属性,但当然您可以在具有两个文字结果元素的特定命名空间中创建元素(例如 @987654330 @) 或 xsl:element (&lt;xsl:element name="p" namespace="http://www.w3.org/1999/xhtml"&gt;...&lt;/xsl:element&gt;),您可以在某个命名空间中使用 create 属性,无论是字面意思还是 xsl:attribute。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多