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

Xml XSLT是否必须包含属性前缀?,xml,xslt,xml-namespaces,Xml,Xslt,Xml Namespaces,我的源XML有一个前缀为“wd:”的属性,如下所示 <wd:EMPLID>1234</wd:EMPLID> <wd:First_Name>Jack</wd:First_Name> 1234 杰克 当我编写XSLT时,有没有一种方法可以说 而不是 目标是使代码更易于阅读 是的,属性xpath default namespace可用于此目的 见: 属性[xsl:]xpath默认名称空间(请参见3.5标准属性)可用于样式表中的元素,以定义

我的源XML有一个前缀为“wd:”的属性,如下所示

<wd:EMPLID>1234</wd:EMPLID>  
<wd:First_Name>Jack</wd:First_Name>  
1234
杰克
当我编写XSLT时,有没有一种方法可以说

而不是


目标是使代码更易于阅读

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

见:

属性[xsl:]xpath默认名称空间(请参见3.5标准属性)可用于样式表中的元素,以定义将用于xpath表达式中不固定的元素名或类型名的名称空间

例如,它可以在
样式表
元素上使用:

<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时,有没有一种方法可以说

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

而不是

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

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

其次,XPath和XSLT根据“扩展名称”(即(名称空间URI、名称)对)评估名称测试,因此您必须以某种方式指定每个名称所属的名称空间(如果有)。XSLT元素属性中XPath表达式的有效名称空间前缀绑定是该XSLT元素范围内的绑定。但是,该范围中适用的任何默认命名空间都不适用于此类XPath表达式

如果您使用的是XSLT1.0,那么基本上就是这样。该语言没有提供指定非空默认名称空间的机制,在该名称空间中解释XPath表达式中出现的不固定名称。您的实现可能有一个扩展提供了这一点,但是依赖这样的扩展是不可移植的


但是,如果您使用的是XSLT2.0或更高版本,那么对于您想要做的事情有一个特定的规定,正如另一个答案已经给出的那样。包含xpath表达式的元素(如果有)的
xpath default namespace
属性或包含xpath表达式的最内层元素(如果有)的
xpath default namespace属性指定用于解释表达式中不固定名称的命名空间URI。您可以在样式表级别,在
元素的
xsl:value上,或在之间的任何元素上指定。

我不这样认为,不。名称空间被认为是标记的一部分。您可能可以不使用通配符“*”,但这可能不值得,具体取决于文件。这些不是属性,而是元素。但我们应该指出,这一功能需要XSLT 2.0,而那些不是XML专家的人(如OP)通常会首先选择XSLT 1.0。