允许使用 Relax NG 附加属性
Posted
技术标签:
【中文标题】允许使用 Relax NG 附加属性【英文标题】:Allowing additional attributes with Relax NG 【发布时间】:2011-11-30 17:49:43 【问题描述】:我正在编写一个松弛 NG 模式来验证一些 XML 文件。 对于大多数元素,都有一些必需的属性,并且此 XML 模式的实例还可以添加任何额外的属性。
例如,这是一个有效的文档:
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:param="some-uri#params">
<someElement
param:requiredAttribute1="foo"
param:requiredAttribute2="bar"
param:freeExtraParam="toto"
param:freeExtraParam="titi" />
</root>
在我的 Relax NG 架构中,我是这样表达的:
<?xml version="1.0" encoding="utf-8" ?>
<grammar
xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<start>
<element name="someElement" >
<attribute name="requiredAttribute1" />
<attribute name="requiredAttribute2" />
<!-- Any extra param -->
<zeroOrMore>
<attribute>
<nsName ns="some-uri#params" />
</attribute>
</zeroOrMore>
</element>
</start>
</grammar>
但是,当我尝试使用 jing 验证我的文档时,它抱怨我的架构无效:
error: duplicate attribute "requiredAttribute1" from namespace "some-uri#params"
我猜这是因为 requiredAttribute1 也符合“任何属性”规则。 这样做的正确方法是什么?
提前致谢, 拉斐尔
【问题讨论】:
【参考方案1】:第一点:start
元素是定义 XML 根元素的地方。此起始元素中不可能有属性。
关于您的属性:使用except
的以下架构应该是您的答案:
<grammar
xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<start>
<element name="root">
<ref name="someElement"/>
</element>
</start>
<define name="someElement">
<element name="someElement">
<zeroOrMore>
<attribute ns="some-uri#params">
<anyName>
<except>
<name>requiredAttribute1</name>
<name>requiredAttribute2</name>
</except>
</anyName>
</attribute>
</zeroOrMore>
<attribute ns="some-uri#params" name="requiredAttribute1"/>
<attribute ns="some-uri#params" name="requiredAttribute2"/>
</element>
</define>
</grammar>
【讨论】:
谢谢。对于第一点,这只是我通过简化问题示例而犯的一个错误。我已经编辑并修复了它。我曾想过“except”关键字,但我想避免它,因为它阻止我编写一个通用的“extraElements”命名模式。 好的。我认为如果没有这个,你就无法实现,没有例外,而且是通用的。以上是关于允许使用 Relax NG 附加属性的主要内容,如果未能解决你的问题,请参考以下文章
Docker CLI 无法使用“不允许附加属性 postgres”进行组合