我想不出一種簡單而優雅的方式,使用XPath或簡單的XSLT模板在XML文檔中查找「上一個」和「下一個」元素。下面是一個示例XML文檔(在真實的文件,@id
的就不會這麼簡單地訂購)使用XSLT/XPath在文檔中查找上一個/下一個元素
<manual>
<section id="1">
<section id="2">
<section id="3"/>
<section id="4"/>
<section id="5"/>
</section>
<section id="6">
<section id="7"/>
<section id="8"/>
<section id="9"/>
</section>
</section>
<section id="10"/>
<section id="11">
<section id="12"/>
</section>
</manual>
這裏就是我的文檔順序意味着先前/隨後
+------------------+------------------+--------------+
| Selected section | Previous section | Next section |
+------------------+------------------+--------------+
| 1 | none | 2 |
| 2 | 1 | 3 |
| 3 | 2 | 4 |
| 4 | 3 | 5 |
| 5 | 4 | 6 |
| ... | ... | ... |
| 10 | 9 | 11 |
| 11 | 10 | 12 |
| 12 | 11 | none |
+------------------+------------------+--------------+
的preceding::
軸的問題是排除了祖先,即section[id=2]
不是section[id=3]
的前一個節點。
以相同的方式,following::
軸不包括後代,即section[id=3]
不是section[id=2]
的後續節點。
那麼,我怎麼能產生「上一個」和「下一個」元素,例如從這些模板:
<xsl:template match="section" mode="prev">
<xsl:value-of select="... what to put here ..."/>
</xsl:template>
<xsl:template match="section" mode="next">
<xsl:value-of select="... what to put here ..."/>
</xsl:template>
注意,這是一個相似但不相同的問題在這裏:XPath 1.0 closest preceding and/or ancestor node with an attribute in a XML Tree。這些XPath的構造是真的結束了我的頭,有時...
將它們與|並選擇第一個 –
@尼古拉斯:工會什麼在一起? '::前::和祖先::'?這對'@ id = 6'不起作用,前面的部分應該是5,我想呢? –
@尼古拉斯,我錯了。看到馬丁的回答。多謝你們! –