我试图为下面的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[. !="NO_INPUT_QUANTITY"]"/>
<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>
答案 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表达式: