Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在定义的范围内强制XML属性唯一性_Xml_Xsd - Fatal编程技术网

在定义的范围内强制XML属性唯一性

在定义的范围内强制XML属性唯一性,xml,xsd,Xml,Xsd,我需要强制元素属性的唯一性,但只能在父元素的范围内。下面是一个有效XML的示例 <ns:Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns="urn:Test.Namespace" xsi:schemaLocation="urn:Test.Namespace Test1.xsd" > <ns:element1 id="001">

我需要强制元素属性的唯一性,但只能在父元素的范围内。下面是一个有效XML的示例

<ns:Root
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ns="urn:Test.Namespace"  
    xsi:schemaLocation="urn:Test.Namespace Test1.xsd"
    >
    <ns:element1 id="001">
        <ns:element2 id="001.1" order="1">
            <ns:element3 id="001.1.1" />
        </ns:element2>
        <ns:element2 id="001.2" order="2">
            <ns:element3 id="001.1.2" />
        </ns:element2>        
    </ns:element1>
    <ns:element1 id="002">
       <ns:element2 id="002.1" order="1">
           <ns:element3 id="002.1.1" />
        </ns:element2>
        <ns:element2 id="002.2" order="2">
            <ns:element3 id="002.1.2" />
        </ns:element2>        
    </ns:element1>    
</ns:Root>

请注意,上面有两组“element1”,其中element2节点有一个名为“order”的属性。要求是“订单”在父“element1”中必须是唯一的。例如,此简化版本将是无效的XML

<ns:Root
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ns="urn:Test.Namespace"  
    xsi:schemaLocation="urn:Test.Namespace Test1.xsd"
    >
    <ns:element1 id="001">
        <ns:element2 id="001.1" order="1">
            <ns:element3 id="001.1.1" />
        </ns:element2>
        <ns:element2 id="001.2" order="2">
            <ns:element3 id="001.1.2" />
        </ns:element2>        
    </ns:element1>
    <ns:element1 id="002">
       <ns:element2 id="002.1" order="1">
           <ns:element3 id="002.1.1" />
        </ns:element2>
        <ns:element2 id="002.2" order="2">
            <ns:element3 id="002.1.2" />
        </ns:element2>        
    </ns:element1>    
</ns:Root>
<ns:Root
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ns="urn:Test.Namespace"  
    xsi:schemaLocation="urn:Test.Namespace Test1.xsd"
    >
    <ns:element1 id="001">
        <ns:element2 id="001.1" order="1">
            <ns:element3 id="001.1.1" />
        </ns:element2>
        <ns:element2 id="001.2" order="1">
            <ns:element3 id="001.1.2" />
        </ns:element2>        
    </ns:element1>    
</ns:Root>

我已经写了下面的模式来为我做这件事

<?xml version="1.0"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="urn:Test.Namespace"
            xmlns:ns="urn:Test.Namespace"
            elementFormDefault="qualified">
    <xsd:element name="Root">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="element1" maxOccurs="unbounded" type="ns:element1Type"/>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:unique name="uniqueElement2OrderInElement1">
            <xsd:selector xpath="./ns:element1" />
            <xsd:field xpath="ns:element2/@order" />
        </xsd:unique>        
    </xsd:element>

    <xsd:complexType name="element1Type">
        <xsd:sequence>
            <xsd:element name="element2" maxOccurs="unbounded" type="ns:element2Type"/>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="element2Type">
        <xsd:sequence>
            <xsd:element name="element3" type="ns:element3Type" />
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:string" />
        <xsd:attribute name="order" type="xsd:string" />
    </xsd:complexType>

    <xsd:complexType name="element3Type">
        <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>        
</xsd:schema>

这很接近,因为它确实强制唯一性,但在文档范围内。即每个订单属性都必须是唯一的。我认为这是因为它被放置在根目录的模式中,但我尝试将它移动到更本地化的位置,或者使选择器更具体,但它不起作用(我会出错)

我想做的事可能吗


非常感谢期待

您将其移动到正确的轨道上,据我所知,xsd:unique containt的范围取决于您将其放置在哪个元素中。因此,如果希望某个元素在给定的element1中是唯一的,那么将其放置在element1xsd:element块中

我尝试了您的示例(当然是在剥离了名称空间之后),如果您移动xsd:unique块并按照下面的方式更新XPath,它应该可以工作

<xsd:element name="Root">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="element1" maxOccurs="unbounded" type="ns:element1Type">
                <xsd:unique name="uniqueElement2OrderInElement1">
                    <xsd:selector xpath="./ns:element2" />
                    <xsd:field xpath="@order" />
                </xsd:unique> 
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>               
</xsd:element>

这一点非常有效,事后看来(新的一天和所有这些)现在已经非常明显了。谢谢你的帮助。