使用自定义属性扩展XSD?

时间:2016-03-29 15:54:51

标签: xml xsd

有没有办法使用自定义属性扩展XSD元素?

例如,我想在XSD中执行以下操作:

<xs:element name="myElement" type="xs:string" myCustomAttribute="true" />

3 个答案:

答案 0 :(得分:5)

使用自定义属性扩展XSD可以通过首先在您自己的命名空间中定义自定义属性来完成,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           targetNamespace="http://www.mycompany.com" 
           elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:attribute name="myAttribute" type="xs:boolean" default="true"/>
</xs:schema>

在此命名空间http://www.mycompany.com中,定义了名为myAttribute的单个属性,其类型为xs:boolean

接下来,在目标模式中使用此命名空间,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xmlns:mc="http://www.mycompany.com" 
           xsi:schemaLocation="http://www.mycompany.com ./doc.xsd" 
           elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="element1" mc:myAttribute="false"/>
</xs:schema>

在此示例中,<schema>元素包含定义自定义命名空间(xmlns:mc="http://www.mycompany.com")的属性,以及自定义架构文件(xsi:schemaLocation="http://www.mycompany.com ./doc.xsd")的位置。

目标架构包含单个元素"element1",并且具有上面定义的自定义属性myAttribute,其值为"false"。请注意,自定义属性的名称以自定义名称空间前缀为前缀。另请注意,如果使用无效类型的值(例如:mc:myAttribute="invalid"),则会生成验证错误。

感谢@GhislainFourny和@kjhughes寻求这个答案的帮助。

答案 1 :(得分:1)

不,您无法在不混淆XSD处理器的情况下将自己的组件添加到XSD。

例如,遇到自定义属性示例时,Xerces-J

<xs:element name="myElement" type="xs:string" myCustomAttribute="true" />

将回复以下错误

  

[错误] try.xsd:3:59:s4s-att-not-allowed:属性   'myCustomAttribute'不能出现在元素'element'中。

如果您想要扩充XSD,请使用xsd:annotation/xsd:appinfo或您自己的命名空间中的属性[来源:@SpatialBridge]

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:myns="http://www.mycompany.com">
  <xs:element name="myElement" myns:myCustomAttribute="true"/>
</xs:schema>

答案 2 :(得分:0)

XBRL是一个使用自己的自定义属性扩展XML Schema的技术示例。

以下示例直接来自XBRL 2.1 specification。 xbrli:balance和xbrli:periodType由XBRL在XML Schema之上添加。

<element
  id="a2"
  name="fixedAssets"
  xbrli:balance="debit"
  xbrli:periodType="instant"
  type="xbrli:monetaryItemType"
  substitutionGroup="xbrli:item"/>

正如kjhughes的回答中所述,您需要使用自己的命名空间(在这种情况下,xbrli前缀与http://www.xbrl.org/2003/instance绑定)。