xml – 为什么XSLT中的属性不需要名称空间声明
为什么我不必在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的答案是这样的:
让我解释这样一个设计决定背后的原因: 逻辑是属性完全由它出现的元素定义,因此如果元素属于特定的命名空间,则不需要指定它们的任何属性属于该(或其他)命名空间. 换句话说,属性不需要命名空间来消除歧义,就像元素的情况一样 – 因为属性完全被它所属的元素消除歧义. 因此,在设计新的基于XML的词汇表时,将属性定义为属于命名空间是一个坏主意. 此常识规则的一个例外是具有全局范围的属性(可以出现在任何元素上).这些属性的示例是:xml:lang,xml:space,…等. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |