有没有办法使用自定义属性扩展XSD元素?
例如,我想在XSD中执行以下操作:
<xs:element name="myElement" type="xs:string" myCustomAttribute="true" />
答案 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绑定)。