1

有没有办法使用 xPath 从第一个“行”到第二个和前面的“行”节点的每个节点获取正确的节点?
XML 数据:

<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”。只有这一行带有“小时”,但有几行带有值。

我想做的是:

以某种方式获取节点的位置并在第一个“行”节点的谓词中使用该位置。

4

1 回答 1

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

它通过计算这个item元素前面的元素数量来计算正确的位置。

于 2013-08-06T16:12:15.707 回答