仅获取第一次出现的上一个节点
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仅获取第一次出现的上一个节点相关的知识,希望对你有一定的参考价值。
我有以下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中的变量。
解决这个问题的方法是什么?
答案
你不能在XSLT中破坏xsl:for-each
构造,因为它实际上不是一个循环而是一个映射构造。例如,XSLT处理器实际上可以并行处理它选择的节点。
你根本不需要这里的xsl:for-each
。在这种情况下你想要的表达是这个......
<xsl:copy-of select="/table/row[following-sibling::row[1]/column = '4'][1]" />
以上是关于仅获取第一次出现的上一个节点的主要内容,如果未能解决你的问题,请参考以下文章