2015-11-04 154 views
0

我具有以下XML內容:選擇xml元素匹配屬性

<root> 
    <content> 
     <figure id="fig-001"> 
      <graphic id="fig-001-graId-001"/> 
      <graphic id="fig-001-graId-002"/> 
      <graphic id="fig-001-graId-003"/> 
     </figure> 
     <figure id="fig-002"> 
      <graphic id="fig-002-graId-001"/> 
      <graphic id="fig-002-graId-002"/> 
     </figure>   
     <refs> 
      <ref ref-id="fig-001-graId-001" type="test"/> 
      <ref ref-id="fig-002-graId-001" type="test"/> 
     </refs> 
    </content> 
</root> 

我使用氧

我點擊的元件參/ REF,例如在

<ref ref-id="fig-01-graId-001 type="test" /> 

我想要一個xpath,其中有圖形/ @ id = ref/@ ref-id(我單擊時)的圖形元素,類似這樣的事情:

count(// content/figure/graphic [@id = // ref/@ ref-id]/parent ::/graphic)==> 3(ref-id = fig-001-graId -001有3個圖形元素)

+0

您希望對該輸入樣本有哪個結果? –

+0

我編輯了我的問題,對不起,這是不正確的 – Valeriane

+0

「*我點擊一個元素refs/ref *」XPath不知道你點擊了哪裏。 –

回答

0

我想你想做的事:

count(//graphic[@id=//ref/@ref-id]/../graphic) 

或者,如果你喜歡:

count(//figure[graphic/@id=//ref/@ref-id]/graphic) 
+0

是的,但只有一個/ ref/@ ref-id – Valeriane

+0

@Valeriane請解釋一下你的意思。你的輸入例子中只有一個ref/@ ref-id。如果有兩個(或更多),兩者都會被考慮在內。 –

0

用鑰匙,您可以使用

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:key name="id" match="figure" use="graphic/@id"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/"> 
     <xsl:value-of select="count(key('id', //ref/@ref-id)/graphic)"/> 
    </xsl:template> 
</xsl:transform> 

看到http://xsltransform.net/ej9EGc1

+0

感謝您的回覆。不幸的是,我不能使用xsl – Valeriane

+1

然後考慮刪除xslt標籤。 –

1

您特別提到氧氣,所以這裏的一個選項:

for $refid in @ref-id return count(//figure[graphic/@id = $refid]/graphic) 

此XPath 2.0將需要在XPath工具欄使用(請確保您有XPath 2.0中選擇)。我不認爲你可以使用XPath構建器,因爲你失去了你的上下文。

我唯一能夠在100%的時間內正常工作的時間是確保當我單擊ref元素時,元素開始和結束時出現的2個括號(單擊XPath後單擊工具欄來運行XPath)。這確保了上下文是正確的。 (這可以通過在<ref之後直接點擊完成。)

括號在下面的屏幕截圖中突出顯示。還要注意的截圖底部的正確結果:

enter image description here

更新:添加ancestor-or-self::*[1]似乎與得到正確的情況下,無論以幫助那裏的元素,你點擊:

for $refid in ancestor-or-self::*[1]/@ref-id return count(//figure[graphic/@id = $refid]/graphic)