簡體   English   中英

在xpath中設置節點

[英]node-set in xpath

我正在編寫一個xslt樣式表來將xml轉換為另一個xml。

這是原始xml的簡化版本:

 <eml>
        <datatable>
                 <physical>
                     <distribution id="100"/>
                 </physical>
       </datatable>                 

       <software>
           <implementation>
              <distribution id="200"/>
            </implementation>
      </software>
     <additionalMetadata>
        <describes>100</describes>
        <describes>200</describes>
        <describes>300</describes>
        <describes>400</describes>
    </additionalMetadata>
   </eml>

我嘗試使用Xpath來選擇“describe”的節點集,該節點集的值不等於//physical/distributionsoftware/implementation/distribution的id值。 在上面的例子中,我想得到節點集:

   <deseribes>300</describes>
   <deseribes>400</describes>

(100和200是//physical/distributionsoftware/implementation/distribution屬性id值)。

我寫了類似的東西:

<xsl:with-param name="describes-list" 
                select="./describes[//physical/distribution/@id !=. and
                             //software/implementation/distribution/@id != .] "/>

它適用於上面的例子。 但是,數據表和軟件的元素是可重復的。 所以這個xml是有效的:

<eml>
    <datatable>
             <physical>
                 <distribution id="100"/>
             </physical>
   </datatable> 

  <datatable>
             <physical>
                 <distribution id="300"/>
             </physical>
   </datatable>                

   <software>
       <implementation>
          <distribution id="200"/>
       </implementation>
  </software>
 <additionalMetadata>
    <describes>100</describes>
    <describes>200</describes>
    <describes>300</describes>
    <describes>400</describes>
  </additionalMetadata>
</eml>

但我的xslt不適用於上面的例子:(

你介意對此有所了解嗎? 先感謝您!

這是一個經常犯的錯誤。 當一個或兩個操作數是節點集時,切勿使用XPath的“!=”運算符

value != node-set

根據定義,如果節點集中存在節點n,則為true

value不等於string(n)

你想要的是那個

value不等於node-set中的任何節點。

這可以用以下方式表達:

value = node-set

如果節點集中至少存在一個節點n,則為true,這樣:

value = string(n)

然后

not(value = node-set)

如果節點集中不存在任何節點n,則為true

value = string(n)

因此,以下XPath表達式將選擇所需的節點

/*/*/describes[not(. = ../../*/physical/distribution/@id)
              and 
                not(. = ../../*/implementation/distribution/@id)]

我個人更願意只將上下文節點與兩個節點集的並集進行一次比較:

/*/*/describes
            [not(. = (../../*/physical/distribution/@id
                    | 
                      ../../*/implementation/distribution/@id
                     )
                 )
            ]

請注意,我避免使用“//”縮寫 它通常非常昂貴(效率低​​下),只有在我們不知道XML文檔的結構時才應該使用它。

當然,上述XPath表達式必須針對以下XML文檔進行評估(問題中提供的第二個):

<eml>
    <datatable>
        <physical>
            <distribution id="100"/>
        </physical>
    </datatable>
    <datatable>
        <physical>
            <distribution id="300"/>
        </physical>
    </datatable>
    <software>
        <implementation>
            <distribution id="200"/>
        </implementation>
    </software>
    <additionalMetadata>
        <describes>100</describes>
        <describes>200</describes>
        <describes>300</describes>
        <describes>400</describes>
    </additionalMetadata>
</eml>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM