2012-11-24 39 views
1

這裏是我正在使用的xml,我試圖找到我遇到的第一個不同pd值的id號。xquery ---到達下一個節點,其值與當前值不同

<result> 
    <pd>a</pd> 
    <id>1</id> 
    <pd>a</pd> 
    <id>2</id> 

    <pd>b</pd> 
    <id>8</id> 

    <pd>c</pd> 
    <id>9</id> 
    <pd>c</pd> 
    <id>4</id> 

    <pd>d</pd> 
    <id>7</id> 
</result> 

讓我期待的結果是:

<pd>a</pd> 
<id>1</id> 

<pd>b</pd> 
<id>8</id> 

<pd>c</pd> 
<id>9</id> 

<pd>d</pd> 
<id>7</id> 

我用以下同胞:: * [2]進入下一個PD和比較,與當前節點,但隨後只給了我b,而不是c和d。你可以給我一個關於如何迭代整個XML來獲得所需輸出的提示嗎?謝謝!!

回答

1

可能有更優雅的解決方案,但我採取的策略是收集pd元素中的所有不同值,然後循環遍歷所有的pd元素並獲取第一個兄弟,其中pd中的值元素匹配不同值的當前迭代中的值。

for $distinct-pd in fn:distinct-values($xml//pd) 
    for $pd in $xml//pd[./text() eq $distinct-pd][1] 
    return ($pd, $pd/following-sibling::*[1]) 

爲您的代碼,這會產生

<pd>a</pd> 
<id>1</id> 
<pd>b</pd> 
<id>8</id> 
<pd>c</pd> 
<id>9</id> 
<pd>d</pd> 
<id>7</id> 
1

達到相同的另一種方式 - 不夠好不是很長的序列:

/*/pd[not(. = preceding-sibling::pd)] 
       /(.|following-sibling::id[1]) 

當這個XPath 2.0表達式(和XQuery)針對提供的XML文檔進行評估:

<result> 
    <pd>a</pd> 
    <id>1</id> 
    <pd>a</pd> 
    <id>2</id> 

    <pd>b</pd> 
    <id>8</id> 

    <pd>c</pd> 
    <id>9</id> 
    <pd>c</pd> 
    <id>4</id> 

    <pd>d</pd> 
    <id>7</id> 
</result> 

想要的,正確的結果產生

<pd>a</pd> 
<id>1</id> 
<pd>b</pd> 
<id>8</id> 
<pd>c</pd> 
<id>9</id> 
<pd>d</pd> 
<id>7</id> 
相關問題