我有以下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中的变量。
解决这个问题的方法是什么?
答案 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; }