XSLT是否必须包含属性前缀?

时间:2017-06-30 14:40:45

标签: xml xslt xml-namespaces

我的源XML具有带有“wd:”前缀的属性,如此

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

当我编写XSLT时,我可以说

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

而不是

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

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

2 个答案:

答案 0 :(得分:2)

  

当我编写XSLT时,我可以说

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

而不是

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

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

第二,XPath,也就是XSLT,针对&#34;扩展名称&#34;评估名称测试,它们是(名称空间URI,名称)对,所以你以某种方式指定每个名称所属的名称空间(如果有)。对XSLT元素属性中的XPath表达式有效的名称空间前缀绑定是该XSLT元素的作用域。但是,适用于该范围的任何默认命名空间都不会应用于此类XPath表达式。

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

但是,如果您正在使用XSLT 2.0或更高版本,那么您可以根据另一个答案给出具体的规定。携带XPath表达式的元素的xpath-default-namespace属性(如果有)或最内层包含元素的元素(如果有)指定用于解释表达式中未加前缀的名称的名称空间URI。您可以在样式表级别,xsl:value-of元素或之间的任何元素上指定。

答案 1 :(得分:0)

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

请参阅:https://www.w3.org/TR/xslt20/#unprefixed-qnames

  

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

例如,它可以在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-->
 >