2010-12-13 40 views
2

獲得一定範圍內的節點我有一個這樣的XML:XSL代碼從XML

<persons> 
<person name="a"> 
</person> 
<person name="f"> 
</person> 
<person name="b"> 
</person> 
<person name="g"> 
</person> 
</persons> 

假設我希望有一個名稱爲「F」和一個名爲「G」之間的所有節點 所以,用XSLT解析它,它應該產生:

<person name="b"> 
</person> 

我怎樣才能做到這一點?

欣賞任何幫助,謝謝!

回答

3

在一個簡單的列表(不是組)這個XPath 1.0表達式:

/persons/person[preceding-sibling::person[@name='f']] 
       [following-sibling::person[@name='g']] 

如果有團體,這個XPath 1.0表達式:

/persons 
/person 
    [count(.|preceding-sibling::person[@name='f'][1] 
      /following-sibling::person[@name='g'][1] 
      /preceding-sibling::*) = 
    count(preceding-sibling::person[@name='f'][1] 
      /following-sibling::person[@name='g'][1] 
      /preceding-sibling::*)] 

在XPath 2.0你可以使用對於兩種情況:

/persons/person[preceding-sibling::person[@name='f'][1] 
       /following-sibling::person[@name='g'][1] >> .] 

在XSLT 1.0,你可以使用:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="kPersonByMarks" match="person" 
      use="concat(generate-id(
          preceding-sibling::person[@name='f'][1]), 
         '+', 
         generate-id(
          following-sibling::person[@name='g'][1]))"/> 
    <xsl:template match="person[@name='f']"> 
     <xsl:copy-of select="key('kPersonByMarks', 
           concat(generate-id(),'+', 
             generate-id(
              following-sibling::person 
                 [@name='g'][1])))"/> 
    </xsl:template> 
</xsl:stylesheet> 

輸出:

<person name="b"></person> 

編輯:正確的 「包括」 表達了用於XPath 1.0和XPath 2.0

+0

+1以獲得正確的答案。 – 2010-12-13 18:39:14

0

我會使用position()函數來選擇位置大於下限位置且小於上限位置的節點。

+0

嗯,這是我的想法太但是它是如何完成的?我正在努力尋找解決方案。 (雖然我最大的問題是在標準的Java XPath實現中找不到許多XPath函數......) – musiKk 2010-12-13 16:48:18

+0

hmm 2秒可能有簡單的解決方案 – Treemonkey 2010-12-13 16:56:04

0
<xsl:apply-templates 
    match="persons/person[not(../preceding-sibling::person[f])]"/>