加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – 为什么XSLT中的属性不需要名称空间声明

发布时间:2020-12-16 23:16:04 所属栏目:百科 来源:网络整理
导读:为什么我不必在XSLT中为节点的属性指定命名空间? 举个例子,假设我有一个如下所示的XML: ?xml version="1.0"?timeline xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:xmlsn:axpz_namesp
为什么我不必在XSLT中为节点的属性指定命名空间?

举个例子,假设我有一个如下所示的XML:

<?xml version="1.0"?>
<timeline xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns="urn:xmlsn:axpz_namespace">

<A>
   <B>
    <C key="in"> bval <C>
    <C ind="ra"> bra <C>
   </B>
<A>

和我的xsl文件头像这样:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:mms="urn:xmlsn:axpz_namespace">

C属性的select语句如下所示:

select="./mms:B/mms:C[@key='in']"/>
select="./mms:B/mms:C[@ind='ra']"/>

但是,如果你必须指定B和C是mms命名空间的一部分,那么你应该指定key和ind也是该命名空间的一部分.即

select="./mms:B/mms:C[@mms:key='in']"/>
select="./mms:B/mms:C[@mms:ind='ra']"/>

虽然很明显,如果你指定节点名称空间为mms,那么它的属性也应该在那里,看起来很明显,如果你指定B在mms名称空间内,那么C应该在那里作为好.

这可能是一个微不足道的问题,可能只是依赖于正在使用的XSL阅读器,但我问,因为它让我很好奇你是否可以在各个节点上混合名称空间.例如,类似于:

select="./mms:B/othernamespace:C[@mms:key='in']"/>

我正在使用Saxon8B阅读器,我猜这种语法可能取决于我使用的阅读器.

解决方法

未加前缀的属性始终位于“无名称空间”中.

而Jon Skeet的答案是这样的:

“Because the W3C namespace Spec says so”

让我解释这样一个设计决定背后的原因:

逻辑是属性完全由它出现的元素定义,因此如果元素属于特定的命名空间,则不需要指定它们的任何属性属于该(或其他)命名空间.

换句话说,属性不需要命名空间来消除歧义,就像元素的情况一样 – 因为属性完全被它所属的元素消除歧义.

因此,在设计新的基于XML的词汇表时,将属性定义为属于命名空间是一个坏主意.

此常识规则的一个例外是具有全局范围的属性(可以出现在任何元素上).这些属性的示例是:xml:lang,xml:space,…等.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读