2016-09-18 2 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(.))]"/> 

하지만이 솔루션을보고 관리 할 수 ​​없습니다. 당신이 table에 대한 템플릿을 작성하는 것처럼

답변

1

당신은 단순히 또 다른 방법은 단순히 문자열 길이로 row/cell[1]를 정렬하는 것입니다 물론

<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> 

을 사용할 수 있으며, 마지막으로는 XPath에와 XSLT 3.0에서 수행 복용 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

나는 다른 하나는 같은 길이의 이상의 셀이있을 때 작동하지 않았기 때문에, 정렬과 솔루션에 의지했다 : 는 AAA로 컴파일 할를했다. 나는 그것이 "보다 낮다"라고 생각하고 "낮거나 같아야한다"라고 상상한다. 그러나 그것은 그 속임수를하지 않았다. 다른 손으로 분류 작업이 바로 진행되었습니다! – martinanton

+0

'

+0

아, 그렇다면 오류가 발생했던 실제 작업 과정에서 구현할 때 엉망이되었습니다.하지만 지금은 작동합니다. – martinanton