2014-12-23 45 views
1

我嘗試做一個不那麼辛苦的xpath 2.0表達式,但仍然被阻止。XPath表達式 - 或不按預期方式工作

下面是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

你沒有'或'表情嗎? – AlexR

+0

是的,如果我只用FMX4或TIFF表達式就可以了。 –

+0

我再次審查你的問題,並不明白的東西。你寫道「那麼我的reference_manifestation格式必須是'FMX4'或'TIFF'」,但是在你的XPath表達式中使用'和not(...)'。你確定你需要'不'嗎?如果你說某件事必須是'FMX4'或'TIFF',那麼你就不需要'不'。或者我錯過了什麼? – AlexR

回答

1

嗯,這是一個非常令人迷惑的表達。

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

用簡單的英語,對行線:

查找文檔中任何地方的元素,如果他們的本地名稱是「表現」。

此外,必須至少有一個本地名稱爲「extension」的子元素,並且此元素又必須具有本地名稱爲「manifestation_type」的子元素,其文本內容必須爲「fmx4」。

此外,原始「表現形式」元素必須至少有一個其他子元素,其本地名稱爲「reference_manifestation」,屬性「format」的值不是「TIFF」和「FMX4」。

使用您當前的輸入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:此路徑表達式沒有任何2.0,這同樣適用於您的原始表達式。

+1

謝謝你的回覆,它似乎工作正常:) –

相關問題