2011-01-04 7 views
1

私はそれにfor-eachループを持つXSLファイルを持っています。そして、私はEXSLTプロセッサを使っていくつかの追加機能(すなわち文字列埋め込み)を行っています。最も長いフィールド長のXSL埋め込み

私ができることをしたいのは、すべてのフィールドを埋めて、そのフィールドの最長レコードの長さにすることです。たとえば、それぞれの名前が最長の名前と同じ長さになるようにしてから、最長のレコード番号の長さになるように各レコード番号を埋め込みます。

私はこれを大丈夫と説明しました。

ありがとうございます。

答えて

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#を使用すると、Saxon 9やXQSharpなどのXSLT 2.0プロセッサーに移動し、アイテムの最大長を簡単に見つけ出し、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 2.0コード(XSLT 2.0コード)と同じようにXSLT 2.0プロセッサ(Saxon 9などのAltovaXMLツールなど)を使用している限り、XSLTスタイルシートにファイルをインクルードまたはインポートすることができます。もちろんHTTP経由での/ importingは効率的ではありませんので、ファイルを一度ダウンロードしてからローカルコピーをインクルード/インポートする必要があります。また、Webサイトからスタイルシートに1つの関数をコピー/ペーストすることもできます。名前空間を定義する必要があります。 'xmlns:xs =" http://www.w3.org/2001/XMLSchema "と'あなたの 'xsl:stylesheet'要素にxmlns:functx =" http://www.functx.com " –

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

関連する問題