以此主题为基础: How do I select an XML node with the longest child #text node value with XPath? 我试图找到表格第1列中最长的单元格。不幸的是,我不知道桌子有多少祖先,有时在一个文本元素中有几个应该被区别对待。
XML
<text><table cols="3" rows="2">
<row >
<cell >first cell first row</cell>
<cell >second cell first row
</cell>
<cell >third cell first row
</cell>
</row>
<row >
<cell >first cell second row</cell>
<cell >this is an incredible long text</cell>
<cell />
</row>
</table>
</text>
XSLT:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="table">
<xsl:variable name="longest1">
<xsl:sequence select=
"/*/table/row/cell[1][not(string-length(.) < /*/table/row/cell[1]/string-length(.))]"/>
</xsl:variable>
<xsl:value-of select="longest1">
</xsl:template>
</xsl:stylesheet>
当然,输出应该是&#34;第一个单元格第二行&#34;,因为第二列未被处理。 我非常确定我所要做的就是修正这条线的/ *:
<xsl:sequence select=
"/*/table/row/cell[1][not(string-length(.) < /*/table/row/cell[1]/string-length(.))]"/>
但我无法找到解决方案。
答案 0 :(得分:1)
在为table
编写模板时,您只需使用
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="table">
<xsl:sequence select="row/cell[1][not(string-length() < current()/row/cell[1]/string-length())]"/>
</xsl:template>
</xsl:stylesheet>
当然,另一种方法只是按照字符串长度排序row/cell[1]
并使用sort(row/cell[1], function($c) { string-length($c)})[last()]
在XSLT 3.0中使用XPath 3.1或使用<xsl:variable name="sorted-cells" as="element(cell)*"><xsl:perform-sort select="row/cell[1]"><xsl:sort select="string-length()"/></xsl:perform-sort></xsl:variable><xsl:copy-of select="$sorted-cells[last()]"/>
在XSLT 2.0中完成。