能否在同一XML标签内使用多个自定义命名的XLink:href引用?
解决方案:用XLink实现自定义属性名的多引用结构
完全可以在保留XLink标准的前提下,实现你想要的「自定义属性名+同一标签多引用」需求,核心是通过XML Schema将自定义属性关联到XLink的引用语义上,而非直接修改XLink的内置属性名。
具体实现步骤
定义自定义属性并关联XLink类型
在XML Schema里,你可以为person元素定义uid(作为被引用的标识)、refM、refF(作为引用属性),并将refM和refF的类型指定为XLink的引用类型,同时保留XLink命名空间的声明。示例Schema片段:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" targetNamespace="http://your-custom-namespace.com" xmlns="http://your-custom-namespace.com" elementFormDefault="qualified"> <!-- 定义person元素的属性组 --> <xs:attributeGroup name="personAttributes"> <xs:attribute name="uid" type="xs:string" use="optional"/> <!-- 定义refM属性,关联XLink的引用语义 --> <xs:attribute name="refM" type="xs:anyURI"> <xs:annotation> <xs:appinfo> <xlink:arcrole>http://your-custom-namespace.com/role/mother</xlink:arcrole> <xlink:type>simple</xlink:type> </xs:appinfo> </xs:annotation> </xs:attribute> <!-- 定义refF属性,关联XLink的引用语义 --> <xs:attribute name="refF" type="xs:anyURI"> <xs:annotation> <xs:appinfo> <xlink:arcrole>http://your-custom-namespace.com/role/father</xlink:arcrole> <xlink:type>simple</xlink:type> </xs:appinfo> </xs:annotation> </xs:attribute> <xs:attribute name="eyes" type="xs:string" use="optional"/> <xs:attribute ref="xsi:type" use="optional"/> </xs:attributeGroup> <!-- 定义person元素 --> <xs:element name="person"> <xs:complexType> <xs:attributeGroup ref="personAttributes"/> </xs:complexType> </xs:element> <!-- 定义根元素xml --> <xs:element name="xml"> <xs:complexType> <xs:sequence> <xs:element ref="person" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute ref="xsi:noNamespaceSchemaLocation" use="optional"/> </xs:complexType> </xs:element> </xs:schema>符合标准的XML实例
基于上述Schema,你可以写出紧凑的XML结构,同时保留XLink的标准语义:<xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:noNamespaceSchemaLocation="your-schema-file.xsd"> <person uid="W1" xsi:type="woman" eyes="blue"/> <person uid="M1" xsi:type="man" eyes="brown"/> <person xsi:type="child" refM="W1" refF="M1"/> </xml>
关键说明
- 这里的
refM和refF虽然是自定义属性名,但通过Schema的xlink:arcrole和xlink:type注解,明确了它们的XLink引用语义,属于XLink标准的扩展用法,并非自定义非标准规则。 uid作为被引用的标识,替代了原生的id,只要在Schema中统一约定,就可以和XLink的引用属性形成完整的关联逻辑。- 这种方式既满足了结构紧凑的需求,又保留了XLink的标准性,不需要放弃XLink的规范。
内容的提问来源于stack exchange,提问作者msciwoj
相关产品推荐
相关产品推荐

