2011-01-04 11 views
1

Ich habe eine XSL-Datei, die eine for-each-Schleife enthält, und ich benutze einen EXSLT-Prozessor, um einige zusätzliche Funktionalität (nämlich die Zeichenfolge Auffüllen) zu geben.XSL-Padding auf die längste Feldlänge

was ich tun möchte, ist alle Felder auszufüllen, so dass sie die Länge des längsten Datensatzes für dieses Feld sind. Zum Beispiel für jeden Namen so lang wie der längste Name und dann für jede Datensatznummer so lange aufgefüllt werden wie die längste Datensatznummer.

Ich hoffe, ich habe das okay erklärt.

Vielen Dank im Voraus.

Antwort

4
<xsl:variable name="maxLength"> 
    <xsl:for-each select="name"> 
    <xsl:sort select="string-length(.)" data-type="number" /> 
    <xsl:if test="postion() = last()"> 
     <xsl:value-of select="string-length(.)" /> 
    </xsl:if> 
    </xsl:for-each> 
</xsl:variable> 
+0

+1 für eine gute Antwort. –

+0

Dies scheint mir alles zu geben, was ich brauche, ohne die XSLT 2.0-Route runter gehen zu müssen. – m4rc

1

Mit C# können Sie zu einem XSLT 2.0 Prozessor wie Saxon 9 oder XQSharp wechseln und dann können Sie einfach die maximale Länge Ihrer Artikel finden und eine Funktion wie http://www.xsltfunctions.com/xsl/functx_pad-string-to-length.html zum Auffüllen verwenden. Wenn Sie es mit XSLT 1.0 und EXSLT tun wollen, dann verwenden Sie http://www.exslt.org/math/functions/max/index.html, um das Maximum zu finden und verwenden Sie eine Lösung in http://www.dpawson.co.uk/xsl/sect2/padding.html zum Pad.

+0

Ich werde die Links gehen geben und sehen, wie Ich verstehe ... Danke für deine schnelle Antwort! – m4rc

+0

@Martin Wissen Sie, wie ich Funktionen von xsltfunctions.com verwenden kann? Ich habe versucht, sie in meine .xsl zu kopieren und einzufügen, funktioniert aber nicht. Wahrscheinlich, weil ich nicht weiß, wo ich es hinstellen soll. Vielleicht habe ich alle diese Datei http://www.xsltfunctions.com/xsl/functx-1.0-doc-2007-01.xsl herunterladen und in meiner .xsl in irgendeiner Weise? Vielen Dank! – bluish

+0

bläulich, sollten Sie in der Lage sein, die Datei in Ihr XSLT-Stylesheet einzufügen oder zu importieren, solange Sie einen XSLT 2.0-Prozessor (wie Saxon 9 oder AltovaXML Tools) als XSLT 2.0-Code verwenden. Natürlich ist das Einbinden/Importieren über HTTP nicht effizient, daher sollten Sie die Datei einmal herunterladen und dann eine lokale Kopie einbinden/importieren. Sie können auch eine einzelne Funktion von der Website in Ihr Stylesheet kopieren/einfügen, Sie müssen sicherstellen, dass Sie die Namespaces 'xmlns: xs =" http://www.w3.org/2001/XMLSchema "' und 'definieren xmlns: functx = "http://www.functx.com" 'auf Ihrem' xsl: stylesheet' Element. –

2

Just for fun, dieses Sheet:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:variable name="vMaxLengthIds"> 
     <xsl:for-each select="/table/tr[1]/*"> 
      <xsl:variable name="vPosition" select="position()"/> 
      <xsl:for-each select="/table/tr/*[$vPosition]"> 
       <xsl:sort select="string-length(.)" data-type="number" /> 
       <xsl:if test="position() = last()"> 
        <xsl:value-of select="concat('|',generate-id(),'|')" /> 
       </xsl:if> 
      </xsl:for-each> 
     </xsl:for-each> 
    </xsl:variable> 
    <xsl:variable name="vMaxLength" 
        select="/table/tr/*[contains(
             $vMaxLengthIds, 
             concat('|',generate-id(),'|'))]"/> 
    <xsl:variable name="vPaddingMask" 
        select="'            '"/> 
    <xsl:template match="tr"> 
     <xsl:apply-templates/> 
     <xsl:text>&#xA;</xsl:text> 
    </xsl:template> 
    <xsl:template match="td"> 
     <xsl:apply-templates/> 
     <xsl:text> | </xsl:text> 
    </xsl:template> 
    <xsl:template match="th"> 
     <xsl:apply-templates/> 
     <xsl:text> + </xsl:text> 
    </xsl:template> 
    <xsl:template match="tr/*/text()"> 
     <xsl:variable name="vPosition" 
         select="count(../preceding-sibling::*)"/> 
     <xsl:value-of 
      select="concat(
         ., 
         substring(
          $vPaddingMask, 
          1, 
          string-length(
           $vMaxLength[count(preceding-sibling::*) 
              = $vPosition]) 
          - string-length()))"/> 
    </xsl:template> 
</xsl:stylesheet> 

Mit diesem Eingang:

<table> 
    <tr> 
     <th>Day</th> 
     <th>Month</th> 
     <th>Year</th> 
    </tr> 
    <tr> 
     <td>1</td> 
     <td>January</td> 
     <td>2011</td> 
    </tr> 
    <tr> 
     <td>31</td> 
     <td>June</td> 
     <td>2011</td> 
    </tr> 
    <tr> 
     <td>11</td> 
     <td>February</td> 
     <td>2011</td> 
    </tr> 
</table> 

Ausgang:

Day + Month + Year + 
1 | January | 2011 | 
31 | June  | 2011 | 
11 | February | 2011 | 
+0

Das ist eigentlich eine wirklich coole Lösung! – m4rc