【发布时间】:2017-03-02 08:44:06
【问题描述】:
我正在尝试为下面的xml 文件编写一个XSD 文件:(它实际上是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 的内容不等于“NO_INPUT_QUANTITY”,那么它应该等于 MEASUREMENT 名称之一。
我用来获取与“NO_INPUT_QUANTITY”内容不同的“InputQuantity”列表的XPath表达式是:
/A2lFile/PROJECT/MODULE/CHARACTERISTIC/AXIS_DESCR/InputQuantity[. !="NO_INPUT_QUANTITY"].
这个表达式有效,它返回“M2”和“M1”。但是当我把它放在我的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>
【问题讨论】: