【问题标题】:How to use predicates with xpath in xsd file?如何在 xsd 文件中使用带有 xpath 的谓词?
【发布时间】: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[. !=&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>

【问题讨论】:

    标签: xml xpath xsd


    【解决方案1】:

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

    我认为最直接的规避方法是将“NO_INPUT_QUANTITY”视为测量名称

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

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

    【讨论】:

    • 感谢您的回复,但遗憾的是我无法修改 xml 文件的内容,另外,NO_INPUT_QUANTITY 表达式仅与“InputQuantity”标签一起使用。所以让我们假设 xml 很好,有没有办法用 或类似的东西来做这个测试?
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多