我尝试做一个不那么难的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' ) ]
有人能帮助我吗?
谢谢
答案 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 :此路径表达式没有任何内容,这同样适用于您的原始表达式。