使用XSLT 2.0查找表中最长的单元

时间:2016-09-18 05:45:53

标签: xslt-2.0

以此主题为基础: 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(.) &lt; /*/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(.) &lt; /*/table/row/cell[1]/string-length(.))]"/>

但我无法找到解决方案。

1 个答案:

答案 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() &lt; 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中完成。