2016-09-18 1 views
0

Построение темы на этом форуме: How do I select an XML node with the longest child #text node value with XPath? Я пытаюсь найти самую длинную ячейку в столбце 1 таблицы. К сожалению, я не знаю, сколько предков имеет таблица, а иногда есть несколько внутри одного текстового элемента, к которым нужно относиться иначе.Поиск самой длинной ячейки в таблице с XSLT 2.0

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> 

Выход конечно должен быть "первая ячейка вторая строка", а второй столбец не является обработанный. Я совершенно уверен, что все, что нужно сделать, это исправить/* этой линии:

<xsl:sequence select= 
       "/*/table/row/cell[1][not(string-length(.) &lt; /*/table/row/cell[1]/string-length(.))]"/> 

Но я не могу управлять, чтобы увидеть решение.

ответ

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] по его строковому длины и принимая последний, сделанный в XSLT 3.0 с помощью XPath 3.1 с использованием sort(row/cell[1], function($c) { string-length($c)})[last()] или в XSLT 2.0 с использованием <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()]"/>.

+0

мне пришлось прибегнуть к вашему решению с сортировкой, потому что другой не работает, когда есть больше ячеек одинаковой длины: будет составлять, как ААА. Я предполагаю, что это связано с «ниже чем» и должно быть «ниже или равно», но это не помогло. Сортировка, с другой стороны, сразу работала! – martinanton

+0

Вы можете использовать '

+0

О, тогда я, должно быть, испортил это, внедряя его в моем реальном жизненном потоке, где он произвел указанную ошибку. Но он работает сейчас – martinanton