2013-08-06 68 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元素的数量计算的正确位置这一个。

相关问题