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

时间:2018-03-06 08:55:21

标签: xml xslt

我有以下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。< / p>

我试图像这样解决它:

<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中的变量。

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

1 个答案:

答案 0 :(得分:0)

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

你根本不需要<xsl:copy-of select="/table/row[following-sibling::row[1]/column = '4'][1]" /> 。在这种情况下你想要的表达是......

public string ParentTitle { get; set; }