使用xs:unique

时间:2017-06-15 21:53:24

标签: xml xpath

我正在尝试检查此XML文件中的所有 partNumber 元素是否具有唯一值:

<?xml version="1.0" encoding="UTF-8"?>
<plfBlocks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../schema/plf_blocks.xsd">
    <plfPart>
        <partName>Screw</partName>
        <plfPart>
            <partName>Philipshead</partName>
            <plfPart>
                <partName>A</partName>
                <partNumber>01234</partNumber>
                <partNumber>01235</partNumber>
                <partNumber>01236</partNumber>
            </plfPart>
            <plfPart>
                <partName>B</partName>
                <partNumber>01244</partNumber>
                <partNumber>01256</partNumber>
                <partNumber>01234</partNumber>
            </plfPart>
        </plfPart>
    </plfPart>
    <plfPart>
        <partName>Nail</partName>
        <partNumber>010101</partNumber>
    </plfPart>
</plfBlocks>

这是我的架构文件:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:element name="plfBlocks">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="plfPart" type="plfPartType" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
        <xs:unique name="uniqueParts">
            <xs:selector xpath="partNumber"/>
            <xs:field xpath="text"/>
        </xs:unique>
    </xs:element>
    <xs:complexType name="plfPartType">
        <xs:sequence>
            <xs:element name="partName" type="xs:string"/>
            <xs:choice>
                <xs:element maxOccurs="unbounded" name="partNumber" type="xs:string"/>
                <xs:sequence>
                    <xs:element maxOccurs="unbounded" name="plfPart" type="plfPartType"/>
                </xs:sequence>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

即使一个partNumber重复,上面的xml代码也会验证。我在xs:unique中为xpath表达式尝试了不同的版本。 &#34; // PARTNUMBER&#34;似乎不受XML Schema的支持。将&#34; partNumber&#34;检查所有出现的情况?

这看起来很基本,但我该如何让它发挥作用?

这是我在迈克尔的帮助下得出的解决方案以及一些进一步的实验:

<xs:unique name="uniqueParts">
    <xs:selector xpath=".//partNumber"/>
    <xs:field xpath="."/>
</xs:unique>

1 个答案:

答案 0 :(得分:0)

使用<xs:selector xpath=".//partNumber"/>

相关问题