XPath:按列浏览表层次结构

时间:2019-03-01 07:11:21

标签: xml xslt xpath

我有一个xml结构,该结构描述了一个具有(x * 2)行且始终为2列的简单表(为简单起见,在下面的示例中x = 1):

<table>
  <tr>
    <td>
    1
    </td>
    <td>
    2
    </td>
  </tr>
  <tr>
    <td>
    3
    </td>
    <td>
    4
    </td>
  </tr>
</table>

现在,我想按以下顺序浏览带有XPath表达式的层次结构:

1-3-2-4

使用访问符号:

  

row [1] :: column [1]-> row [2] :: column [1]-> row [1] :: column [2]-> row [2] :: column [2] < / p>

我该如何使用XPath表达式?

我正在Schema ST4内完成所有这些工作,但是我也欢迎原始xpath表达式的答案,因为我很受困扰。

仅供参考,我来自C ++背景,因此我的想法是我必须能够使用一个迭代器(xsl:iterate)来对相应的行/列进行迭代,但是直到现在我还无法完成这项工作。但是我对XPath还是很陌生,所以我可能缺乏对自己进行派生的理解。

我的xsl迭代器使用

选择每个奇数行(即1,3,5 ..)。
  

tr [position()mod 2 = 1]

这很好。然后,我认为迭代器内部的另一个迭代器将允许我遍历该行的每一列(1,2,3 ..)。可能可行,但是如何从那里获得 next 行的等效列?

这在XPath方面是否有意义,还是我必须从另一个角度进行攻击?

1 个答案:

答案 0 :(得分:1)

您提到了xsl:iterate(它是XSLT 3的一部分),所以我假设您可以使用XSLT 2或3,并且我认为可以通过位置分组完成按列处理/输出单元格的一般任务:

  <xsl:template match="table">
      <xsl:variable name="cols" select="count(tr[1]/td)"/>
      <xsl:for-each-group select="tr/td" group-by="position() mod $cols">
          <xsl:sequence select="current-group()!normalize-space()"/>
      </xsl:for-each-group>
  </xsl:template>

https://xsltfiddle.liberty-development.net/3NJ38YV