简体   繁体   English

如何针对名称空间而不是完整文档的架构进行验证?

[英]How to validate against schema for namespace, not complete document?

I have a document like this: 我有一个像这样的文件:

<d:block xmlns:d="D" xmlns:b="B" xmlns="default" name="popover">
  <d:description>...</d:description>
  <d:sample>
    <b:popover>
      ...some b:stuff...
    </b:popover>
   </d:sample>
</d:block>

Schema for this document looks like: 该文档的架构如下所示:

<grammar xmlns="http://relaxng.org/ns/structure/1.0">
    <start>
        <element name="block" ns="D">
            <attribute name="name"/>
            <element name="description">
                <text/>
            </element>
            <element name="sample">
                <ref name="anything"/>
            </element>
        </element>
    </start>
    <define name="anything">
        <element>
            <anyName>
                <except>
                    <nsName ns="D"/>
                </except>
            </anyName>
            <zeroOrMore>
                <choice>
                    <attribute>
                        <anyName/>
                    </attribute>
                    <text/>
                    <ref name="anything"/>
                </choice>
            </zeroOrMore>
        </element>
    </define>
</grammar>

"Anything" literally means anything but D-namespaced. “任何”字面意思是除D命名空间之外的任何内容。

And I want to create another schema for B namespace to use it against any arbitrary XML containing B:namespace. 我想为B名称空间创建另一个架构,以将其用于包含B:namespace的任意XML。

How to create Schema for the namespace, not for the complete document? 如何为名称空间而非整个文档创建模式?

Can't get this. 无法得到这个。

A kind of schema like that should work. 像这样的一种模式应该起作用。 You just have to define the elements for B namespace in the define element named BElements . 您只需要在名为BElementsdefine元素中为B名称空间define元素。

<grammar xmlns="http://relaxng.org/ns/structure/1.0">
    <start>
      <ref name="anythingOrB"/>
    </start>
    <define name="anythingOrB">
        <choice>
            <ref name="BElements"/>
            <ref name="anythingExceptB"/>
        </choice>
    </define>
    <define name="anythingExceptB">
        <element>
            <anyName>
                <except>
                    <nsName ns="B"/>
                </except>
            </anyName>
            <zeroOrMore>
                <choice>
                    <attribute>
                        <anyName/>
                    </attribute>
                    <text/>
                    <ref name="anythingOrB"/>
                </choice>
            </zeroOrMore>
        </element>    
    </define>
    <define name="BElements">
        <choice>
            <element name="elt1" ns="B">
                <empty/>
            </element>
            <element name="elt2" ns="B">
                <empty/>
            </element>
        </choice> 
    </define>
</grammar>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM