XPath表达式 - 或不按预期工作

时间:2014-12-23 09:12:56

标签: java xpath xpath-2.0

我尝试做一个不那么难的xpath 2.0表达式,但仍然,我被阻止了。

这是xml文件:

<request>
<cmt:transmission>
    <cmt:workflow>
        <cm:work>
            <cm:expression>
                <cm:manifestation>
                    <cm:reference_manifestation format="FMX4"
                        sequence="1">file1.xml</cm:reference_manifestation>
                    <cm:reference_manifestation format="TIFF"
                        sequence="2">file2.tif</cm:reference_manifestation>
                    <cm:reference_manifestation format="FMX4"
                        sequence="3">file3.xml</cm:reference_manifestation>
                    <cm:extension xsi:type="ojext:OJManifestationExtensionType">
                        <ojext:manifestation_type>fmx4</ojext:manifestation_type>
                    </cm:extension>
                </cm:manifestation>
            </cm:expression>        
        </cm:work>
    </cmt:workflow>
</cmt:transmission>

我尝试做的XPath是: 如果我的 manifestation_type 是'fmx4',那么我的 reference_manifestation 的格式必须是'FMX4'或'TIFF'。如果我的规则不受尊重,那么我想获得表现

这是我当前的无效 xpath:

descendant::*:manifestation[*:extension/*:manifestation_type ='fmx4' and not (*:reference_manifestation/@format = 'FMX4' or *:reference_manifestation/@format = 'TIFF' ) ]

有人能帮助我吗?

谢谢

1 个答案:

答案 0 :(得分:1)

嗯, 是一个非常令人困惑的表达。

//*[local-name() = 'manifestation'
and *[local-name() = 'extension']/*[local-name() = 'manifestation_type'] = 'fmx4'
and *[local-name() = 'reference_manifestation']/@format[. != 'TIFF' and . != 'FMX4']]

用简单的英语,换行:

  

在文档中的任何位置查找元素,如果它们的本地名称是&#34;表现形式&#34;。

     

此外,必须至少有一个具有本地名称&#34;扩展名&#34;的子元素。而这个元素又必须有一个具有本地名称的孩子&#34; manifestation_type&#34;其文字内容必须是&#34; fmx4&#34;。

     

此外,原始&#34;表现&#34; element必须至少有一个具有本地名称的其他子元素&#34; reference_manifestation&#34;和属性&#34;格式&#34;其价值不是&#34; TIFF&#34;也不是&#34; FMX4&#34;。

使用当前的输入XML,路径表达式不返回任何内容(因为规则得到遵守)。如果您将输入更改为以下(并且还声明了所有缺少的名称空间!):

<request xmlns:cm="www.example.com" xmlns:cmt="www.example2.com"
xmlns:ojext="www.example3.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<cmt:transmission>
    <cmt:workflow>
        <cm:work>
            <cm:expression>
                <cm:manifestation>
                    <cm:reference_manifestation format="FMX4"
                        sequence="1">file1.xml</cm:reference_manifestation>
                    <cm:reference_manifestation format="TIFF"
                        sequence="2">file2.tif</cm:reference_manifestation>
                    <cm:reference_manifestation format="SOMETHINGELSE"
                        sequence="3">file3.xml</cm:reference_manifestation>
                    <cm:extension xsi:type="ojext:OJManifestationExtensionType">
                        <ojext:manifestation_type>fmx4</ojext:manifestation_type>
                    </cm:extension>
                </cm:manifestation>
            </cm:expression>        
        </cm:work>
    </cmt:workflow>
</cmt:transmission>
</request>

然后返回表现形式,因为一个format属性偏离允许的值。


注意1:在这类情况下,它非常复杂,部分原因是您忽略了文档中存在的命名空间。如果您注册适当地声明这些名称空间并在路径表达式中使用前缀,那将会有很大帮助。

注释2 :此路径表达式没有任何内容,这同样适用于您的原始表达式。