如何在xsd文件中使用带有xpath的谓词?

时间:2017-03-02 08:44:07

标签: xml xpath xsd

我试图为下面的XSD文件写一个xml文件:(它实际上是A2L文件特定部分的xml表示)

 <?xml version="1.0" encoding="UTF-8"?>
 <A2lFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="testXpath.xsd">
    <PROJECT>
        <MODULE>
            <MEASUREMENT>
                <Name>M1</Name>
            </MEASUREMENT>
            <MEASUREMENT>
                <Name>M2</Name>
            </MEASUREMENT>
            <MEASUREMENT>
                <Name>M3</Name>
            </MEASUREMENT>
            <MEASUREMENT>
                <Name>M4</Name>
            </MEASUREMENT>
            <MEASUREMENT>
                <Name>Mn</Name>
            </MEASUREMENT>

            <CHARACTERISTIC>
                <AXIS_DESCR>
                    <InputQuantity>M2</InputQuantity>
                </AXIS_DESCR>
            </CHARACTERISTIC>
            <CHARACTERISTIC>
                <AXIS_DESCR>
                    <InputQuantity>NO_INPUT_QUANTITY</InputQuantity>
                </AXIS_DESCR>
            </CHARACTERISTIC>
            <CHARACTERISTIC>
                <AXIS_DESCR>
                    <InputQuantity>M1</InputQuantity>
                </AXIS_DESCR>
            </CHARACTERISTIC>

        </MODULE>
    </PROJECT>
</A2lFile>

我想使用xpath插入的约束之一是: 如果InputQuantity的内容不等于&#34; NO_INPUT_QUANTITY&#34;那么它必须等于MEASUREMENT名称之一。

用于获取&#34; InputQuantity&#34;的列表的XPath表达式哪些内容与&#34; NO_INPUT_QUANTITY&#34;是:

/A2lFile/PROJECT/MODULE/CHARACTERISTIC/AXIS_DESCR/InputQuantity[. !="NO_INPUT_QUANTITY"]. 

此表达式有效且返回&#34; M2&#34;和&#34; M1&#34;。但是,当我将其放在我的xsd文件中时,xsd验证程序不接受它并返回此类错误:

The value 'PROJECT/MODULE/CHARACTERISTIC/AXIS_DESCR/InputQuantity[. !="NO_INPUT_QUANTITY"]' 
of attribute 'PROJECT/MODULE/CHARACTERISTIC/AXIS_DESCR/InputQuantity[. !="NO_INPUT_QUANTITY"]' of identity constraint definition 'reference_InputQuantity' 
is not a valid restricted XPath expression.

这是我的xsd文件:

    <?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <!-- file root -->
    <xs:element name="A2lFile" type="A2lFileType">
        <xs:unique name="MEASUREMENT_Name">
            <xs:selector xpath="PROJECT/MODULE/MEASUREMENT/Name"/>
            <xs:field xpath="."/>
        </xs:unique>
        <xs:keyref name="reference_InputQuantity" refer="MEASUREMENT_Name">
            <xs:selector xpath="PROJECT/MODULE/CHARACTERISTIC/AXIS_DESCR/InputQuantity[. !=&quot;NO_INPUT_QUANTITY&quot;]"/>
            <xs:field xpath="."/>
        </xs:keyref>
    </xs:element>

    <xs:complexType name="A2lFileType">
        <xs:sequence>
            <xs:element name="PROJECT" type="projectType" maxOccurs="1"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="projectType">
        <xs:sequence>
            <xs:element name="MODULE" type="moduleType" maxOccurs="1"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="moduleType">
        <xs:sequence>
            <xs:element name="MEASUREMENT" type="measurementType" maxOccurs="unbounded"/>
            <xs:element name="CHARACTERISTIC" type="characteristicType" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="measurementType">
        <xs:sequence>
            <xs:element name="Name" type="xs:string" maxOccurs="1"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="characteristicType">
        <xs:sequence>
            <xs:element name="AXIS_DESCR" type="axis_descType"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="axis_descType">
        <xs:sequence>
            <xs:element name="InputQuantity" type="xs:string" maxOccurs="1"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

2 个答案:

答案 0 :(得分:0)

XML Schema限制可用于非常简单子集的XPath表达式,并且不允许使用过滤器。

我认为避免这种情况最直接的方法是治疗&#34; NO_INPUT_QUANTITY&#34;作为测量名称

<MEASUREMENT>
  <Name>NO_INPUT_QUANTITY</Name>
</MEASUREMENT>

这样,过滤器变得不必要,XPath表达式满足XML Schema的约束。

答案 1 :(得分:0)

可以在xpath元素的<xs:selector/>属性中使用的XPath表达式受XML Schema specification限制。这被称为XPath的选择器子集

特别是,这意味着XPath表达式:

  • 不能包含测试
  • 只能选择后代元素