【发布时间】:2016-07-17 07:10:25
【问题描述】:
有没有办法用自定义属性扩展 XSD 元素?
例如,我想在 XSD 中执行以下操作:
<xs:element name="myElement" type="xs:string" myCustomAttribute="true" />
【问题讨论】:
有没有办法用自定义属性扩展 XSD 元素?
例如,我想在 XSD 中执行以下操作:
<xs:element name="myElement" type="xs:string" myCustomAttribute="true" />
【问题讨论】:
不,您不能在不混淆 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 或您自己的命名空间中的属性 [Credit: @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>
【讨论】:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:myns="http://www.mycompany.com" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="myElement" myns:myCustomAttribute="true"> </xs:element> </xs:schema>
import 我自己的命名空间,如果该属性未定义或具有 type="xs:integer",则不会引发错误。
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 绑定)。
【讨论】:
使用自定义属性扩展 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 为这个答案提供帮助。
【讨论】: