【问题标题】:Allowing additional attributes with Relax NG允许使用 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 也符合“任何属性”规则。 这样做的正确方法是什么?

提前致谢, 拉斐尔

【问题讨论】:

    标签: xml xsd relaxng jing


    【解决方案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”命名模式。
    • 好的。我认为如果没有这个,你就无法实现,没有例外,而且是通用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2021-11-18
    • 1970-01-01
    • 2023-01-10
    • 2017-07-04
    • 2020-03-02
    • 1970-01-01
    相关资源
    最近更新 更多