仅获取第一次出现的上一个节点

问题描述 投票:0回答:1

我有以下XML:

<table>
  <row>
    <column>a</column>
    <column>2</column>
  </row>
  <row>
    <column>b</column>
    <column>1</column>
  </row>
  <row>
    <column>c</column>
    <column>4</column>
  </row>
  <row>
    <column>d</column>
    <column>3</column>
  </row>
  <row>
    <column>e</column>
    <column>4</column>
  </row>
  <row>
    <column>f</column>
    <column>4</column>
  </row>
</table>

仅作为我的XSLT的结果,我想要在第一次出现包含'4'的列之前的列中的数字。所以我的结果需要是1。我该怎么做呢?

我能想到的唯一方法是xsl:for-each,所以我的XSLT如下:

<xsl:for-each select="//table/row/column[2][.='4']">
  <xsl:if test="count(../../preceding-sibling::node()) + 1 = 1">
    <xsl:value-of select="../preceding-sibling::*[1]/column[2]"/>
  </xsl:if>
</xsl:for-each>

我的问题是;结果现在是1 3 4,而我只需要它是1,据我所知,当我发现第一次出现时我无法突破xsl:for-each

我试着像这样解决它:

<xsl:for-each select="//table/row/column[2][.='4']">
  <xsl:if test="count(../../preceding-sibling::node()) + 1 = 1 and $rowFound=false">
    <xsl:value-of select="../preceding-sibling::*[1]/column[2]"/>
    <xsl:variable name="rowFound">true</xsl:variable>
  </xsl:if>
</xsl:for-each>

但是XSLT无法识别变量,因此我收到错误。试图像这样解决它:

<xsl:variable name="rowFound">false</xsl:variable>
<xsl:for-each select="//table/row/column[2][.='4']">
  <xsl:if test="count(../../preceding-sibling::node()) + 1 = 1 and $rowFound=false">
    <xsl:value-of select="../preceding-sibling::*[1]/column[2]"/>
    <xsl:variable name="rowFound">true</xsl:variable>
  </xsl:if>
</xsl:for-each>

但我发现你无法重新分配给XSLT中的变量。

解决这个问题的方法是什么?

xml xslt
1个回答
0
投票

你不能在XSLT中破坏xsl:for-each构造,因为它实际上不是一个循环而是一个映射构造。例如,XSLT处理器实际上可以并行处理它选择的节点。

你根本不需要这里的xsl:for-each。在这种情况下你想要的表达是这个......

<xsl:copy-of select="/table/row[following-sibling::row[1]/column = '4'][1]" />
© www.soinside.com 2019 - 2024. All rights reserved.