【问题标题】:Does XSLT have to include the attribute prefix?XSLT 是否必须包含属性前缀?
【发布时间】:2017-12-04 13:37:45
【问题描述】:

我的源 XML 具有像这样带有“wd:”前缀的属性

<wd:EMPLID>1234</wd:EMPLID>  
<wd:First_Name>Jack</wd:First_Name>  

当我编写我的 XSLT 时,有什么方法可以说

&lt;xsl:value-of select="EMPLID"/&gt;

而不是

&lt;xsl:value-of select="wd:EMPLID"/&gt;

目标是使代码更易于阅读。

【问题讨论】:

  • 我不这么认为,不。命名空间被认为是标签的一部分。您可能可以不使用通配符“*”,但这可能不值得,具体取决于文件。
  • 那些不是属性,它们是元素。

标签: xml xslt xml-namespaces


【解决方案1】:

当我编写我的 XSLT 时,有什么方法可以说

<xsl:value-of select="EMPLID"/>

而不是

<xsl:value-of select="wd:EMPLID"/>

首先,重要的是要理解,重要的不是特定的前缀,而是前缀绑定到的命名空间 URI。源文档和样式表可以使用不同的前缀来指定相同的命名空间 URI。

其次,XPath 和 XSLT 会针对“扩展名称”评估名称测试,扩展名称是(命名空间 URI,名称)对,因此您确实必须以某种方式指定命名空间,如果有的话,每个名字所属的。对 XSLT 元素的属性中的 XPath 表达式有效的名称空间前缀绑定是在该 XSLT 元素的范围内的那些。但是,适用于该范围的任何默认命名空间适用于这样的 XPath 表达式。

如果您使用的是 XSLT 1.0,那就差不多了。该语言没有提供指定非空默认名称空间的机制,在该名称空间中解释出现在 XPath 表达式中的无前缀名称。可能你的实现有一个扩展提供,但依赖这样的扩展是不可移植的。

但是,如果您使用的是 XSLT 2.0 或更高版本,那么对于您想要做的事情有一个特定的规定,正如另一个答案已经给出的那样。带有 XPath 表达式的元素的xpath-default-namespace 属性(如果它有一个)或者最里面的包含一个元素的属性(如果有的话)指定用于解释表达式中无前缀名称的名称空间 URI。您可以在样式表级别、xsl:value-of 元素或两者之间的任何元素上指定。

【讨论】:

    【解决方案2】:

    是的,xpath-default-namespace 属性可以用于此目的。

    见:https://www.w3.org/TR/xslt20/#unprefixed-qnames

    属性 [xsl:]xpath-default-namespace(参见 3.5 标准属性)可用于样式表中的元素,以定义将用于 XPath 表达式中无前缀元素名称或类型名称的名称空间

    例如可以用在stylesheet元素上:

    <xsl:stylesheet version="2.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xpath-default-namespace="http://www.example.com/wd"  
                                     <!-- ^ replace with namespace uri-->
     >
    

    【讨论】:

    • 但是我们应该指出,这个特性需要 XSLT 2.0,而那些不是 XML 专家(比如 OP)的人通常会选择第一个手头的东西,往往是 XSLT 1.0。
    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2012-10-07
    • 2011-12-07
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多