2010-02-23 598 views
4

任何人都可以幫我解決我遇到的這個小問題。XPath當兩個屬性名稱相同時,從當前節點值中選擇節點

的XML

<MPN> 
    <MTR MSN="AB123456"/> 
    <MTR MSN="AB654321"/> 
    <MTR MSN="AB654322"/> 
    <MTR MSN="AB654323」/> 
    <MTR MSN="AB654324"/> 
    <JOB JobId="136"> 
     <JMR MSN="AB123456"> 
      <JRA DateActionRequiredBy="20090701120012" /> 
     </JMR> 
     <JMR MSN="AB654321"> 
      <JRA DateActionRequiredBy="20090701100010" /> 
     </JMR> 
    </JOB> 
</MPN> 

我想從JRA元素檢索DateActionRequiredBy,當解析器正坐在地鐵元素,只有一個應返回。

我試過了。

../JOB/JMR[@MSN = @MSN]/JRA/@DateActionRequiredBy 

返回{尺寸:[2]}節點集,這一切匹配由於該@MSN屬性有效本身匹配不是父。

../JOB/JMR[@MSN = ./@MSN]/JRA/@DateActionRequiredBy 

返回{尺寸:[2]} NODESET

我已經找到了解決方案,但它會要求每一個XSL裏面的變量:屬性,它看起來不正確我。

<xsl:variable name="storeMSN" select="@MSN"/> 
../JOB/JMR[@MSN = $storeMSN]/JRA/@DateActionRequiredBy 

返回 20090701120012屬性

這就是我後,但必須有比每個屬性的一個變量來實現這一點其他更簡單的方法。

在此先感謝。

回答

8
<MPN> 
    <MTR MSN="AB123456"/> 
    <MTR MSN="AB654321"/><!-- current node (i.e. context node) --> 
    <MTR MSN="AB654322"/> 
    <MTR MSN="AB654323」/> 
    <MTR MSN="AB654324"/> 
    <JOB JobId="136"> 
     <JMR MSN="AB123456"> 
      <JRA DateActionRequiredBy="20090701120012" /> 
     </JMR> 
     <JMR MSN="AB654321"> 
      <JRA DateActionRequiredBy="20090701100010" /><!-- desired node --> 
     </JMR> 
    </JOB> 
</MPN> 

那麼你就需要使用這個XPath:

../JOB/JMR[@MSN = current()/@MSN]/JRA/@DateActionRequiredBy 

請注意,這僅XSLT工作,因爲current()是XSLT的功能。

你可以通過添加一個XSL鍵緩解這一進程:

<xsl:key name="kJMR" match="JMR" use="@MSN" /> 

,以及XPath:

key('kJMR', @MSN)/JRA/@DateActionRequiredBy 

解釋爲什麼按預期嘗試不起作用。無論

  • ../JOB/JMR[@MSN = @MSN]/JRA/@DateActionRequiredBy
  • ../JOB/JMR[@MSN = ./@MSN]/JRA/@DateActionRequiredBy

比較@MSN與本身 - 這決不會失敗的操作。這樣你總是可以獲得所有可能的節點。

在謂詞中,XPath上下文始終是您應用謂詞的節點。 current()函數可以爲您提供XSLT上下文。

+0

yes current()是拼圖中缺失的部分。謝謝 ;-) – Nanook 2010-02-23 16:18:24

相關問題