2011-01-04 4 views
1

У меня есть XSL-файл, который имеет для каждого цикла цикл, и я использую EXSLT-процессор, чтобы дать некоторые дополнительные функции (а именно, заполнение строки).XSL padding до самой длинной длины поля

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

Надеюсь, я объяснил это хорошо.

Заранее спасибо.

ответ

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 за хороший ответ. –

+0

Это, кажется, дает мне все, что мне нужно, без необходимости идти по маршруту XSLT 2.0. – m4rc

1

С помощью C# вы можете перейти на XSLT 2.0-процессор, такой как Saxon 9 или XQSharp, а затем вы можете легко найти максимальную длину своих предметов и использовать функцию, например http://www.xsltfunctions.com/xsl/functx_pad-string-to-length.html, чтобы разместить их. Если вы хотите сделать это с помощью XSLT 1.0 и EXSLT, используйте http://www.exslt.org/math/functions/max/index.html, чтобы найти максимальный размер и использовать его в http://www.dpawson.co.uk/xsl/sect2/padding.html.

+0

отдам ссылки пойти и посмотреть, как Я получаю ... Спасибо за ваш быстрый ответ! – m4rc

+0

@Martin Знаете ли вы, как я могу использовать функции из xsltfunctions.com? Я попытался скопировать и вставить их внутри моего .xsl, но не работает. Наверное, потому что я не знаю, куда его поместить. Может быть, мне нужно загрузить весь этот файл http://www.xsltfunctions.com/xsl/functx-1.0-doc-2007-01.xsl и включить в мой .xsl в некотором роде? Благодаря! – bluish

+0

, вы должны иметь возможность включать или импортировать файл в таблицу стилей XSLT, если вы используете процессор XSLT 2.0 (например, Saxon 9 или как AltovaXML Tools), так как это код XSLT 2.0. Конечно, включение/импорт по HTTP неэффективно, поэтому вы должны загрузить файл один раз, а затем включить/импортировать локальную копию. Вы также можете скопировать/вставить одну единицу с веб-сайта в таблицу стилей, вам нужно будет определить пространства имен 'xmlns: xs =" http://www.w3.org/2001/XMLSchema "и' xmlns: functx = "http://www.functx.com" на элементе 'xsl: stylesheet'. –

2

Просто для удовольствия, это таблица стилей:

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

С этим входом:

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

Выход:

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

На самом деле это действительно крутое решение! – m4rc

Смежные вопросы