2013-08-06 34 views
1

有沒有辦法使用xPath從第一個「行」到第二個和之前的「行」節點的每個節點獲取正確的節點?
XML數據:XPath:按照具有非唯一節點名稱的另一個節點的位置選擇節點

<extracted> 
    <row> 
     <item>Hour1</item> 
     <item>Hour2</item> 
     <item>Hour3A</item> 
     <item>Hour3B</item> 
     <item>Hour4</item> 
     <item>Hour5</item> 
     <item>Hour6</item> 
     <item>Hour7</item> 
     <item>Hour8</item> 
     <item>Hour9</item> 
     <item>Hour10</item> 
     <item>Hour11</item> 
     <item>Hour12</item> 
     <item>Hour13</item> 
     <item>Hour14</item> 
     <item>Hour15</item> 
     <item>Hour16</item> 
     <item>Hour17</item> 
     <item>Hour18</item> 
     <item>Hour19</item> 
     <item>Hour20</item> 
     <item>Hour21</item> 
     <item>Hour22</item> 
     <item>Hour23</item> 
     <item>Hour24</item> 
     <item>Aver./Sum</item> 
     </row>   
     <row> 
     <item>12,43</item> 
     <item>12,40</item> 
     <item>12,40</item> 
     <item/> 
     <item>12,40</item> 
     <item>12,40</item> 
     <item>12,48</item> 
     <item>14,35</item> 
     <item>15,48</item> 
     <item>22,79</item> 
     <item>24,16</item> 
     <item>24,35</item> 
     <item>28,25</item> 
     <item>24,68</item> 
     <item>23,30</item> 
     <item>21,93</item> 
     <item>16,76</item> 
     <item>15,08</item> 
     <item>15,06</item> 
     <item>14,89</item> 
     <item>14,79</item> 
     <item>16,06</item> 
     <item>15,45</item> 
     <item>14,57</item> 
     <item>14,57</item> 
     <item>17,13</item> 
    </row> 
    <row> 
     <item>12,43</item> 
     <item>12,40</item> 
     <item>12,40</item> 
     <item/> 
     <item>12,40</item> 
     <item>12,40</item> 
     <item>12,48</item> 
     <item>14,35</item> 
     <item>15,48</item> 
     <item>22,79</item> 
     <item>24,16</item> 
     <item>24,35</item> 
     <item>28,25</item> 
     <item>24,68</item> 
     <item>23,30</item> 
     <item>21,93</item> 
     <item>16,76</item> 
     <item>15,08</item> 
     <item>15,06</item> 
     <item>14,89</item> 
     <item>14,79</item> 
     <item>16,06</item> 
     <item>15,45</item> 
     <item>14,57</item> 
     <item>14,57</item> 
     <item>17,13</item> 
    </row> 
</extracted> 

例如:12,43匹配於 「Hour1」。這隻有一行「小時」,但有幾個值。

什麼,我試圖做的事:

以某種方式獲取節點的位置,並使用在第一個「行」節點上的謂詞的位置。

+0

什麼是「輸入」表達式,預期的輸出是什麼? –

回答

1

答案可能會涉及到position()函數,但是魔鬼是在細節中,這一切都取決於您當時正在使用的上下文。使用XSLT作爲一個例子,這個工程:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="extracted"> 
    <ex> 
     <xsl:apply-templates select="row[position() > 1]" /> 
    </ex> 
    </xsl:template> 

    <xsl:template match="row"> 
    <r> 
     <xsl:apply-templates select="item" /> 
    </r> 
    </xsl:template> 

    <xsl:template match="item"> 
    <!-- the current node is an item, and the current node list is the set 
     of item children of the parent row element. Therefore position() 
     is 1 for the first item, 2 for the second item, etc. --> 
    <xsl:variable name="myPosition" select="position()" /> 
    <!-- so here we select the nth item from the first row of the table --> 
    <entry key="{../../row[1]/item[$myPosition]}" value="{.}" /> 
    </xsl:template> 
</xsl:stylesheet> 

但這並不

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="extracted"> 
    <ex> 
     <xsl:apply-templates select="row[position() > 1]" /> 
    </ex> 
    </xsl:template> 

    <xsl:template match="row"> 
    <r> 
     <xsl:apply-templates select="node()" /> 
    </r> 
    </xsl:template> 

    <xsl:template match="item"> 
    <!-- the current node is an item, and the current node list is the set 
     of all child nodes of the parent row element, including text nodes. 
     Therefore position() is 1 for the whitespace before the first item, 
     2 for the first item itself, 3 for the whitespace between the first and 
     second items, 4 for the second item, etc. --> 
    <xsl:variable name="myPosition" select="position()" /> 
    <!-- so here we select the wrong item from the first row of the table --> 
    <entry key="{../../row[1]/item[$myPosition]}" value="{.}" /> 
    </xsl:template> 
</xsl:stylesheet> 

如果你不能確定你是在執行上下文XPath表達式,會給你一個有效position()那麼你就必須使用另一種方法,例如

count(preceding-sibling::item) + 1 

它通過AHEA計數item元素的數量計算的正確位置這一個。

相關問題