-2

私の出力タイプはtextです。レポートの準備をしています。私のテキスト出力は、次の行に折り返さなければならない 50 文字幅のみを受け入れるようになりました。テキスト内の要素を改行する解決策があります。すべての行をラップする代わりに、レポート全体をラップする方法はありますか? ドキュメント全体に対して行うことはできますか?ラインラップの解決策があります。私の問題は、以下のような多くの条件があることです:

Firstname lastname route (condition1 ) (condition2) (condition3) (condition4)..go on...

仮定しましょう:

名の固定幅は 15、姓の固定幅は 15、都市の固定幅は 3...

その後、条件1は幅10、条件2は15で固定され、次に進みます...

重要なことに、これらの条件はオプションのみです...

したがって、15+空スペース+15+空スペース+3 =36 私の条件は36列目から始まります..

最初のラップの後、次のコンディションのために同じラインから続けなければなりませんでした。次の項目では、開始位置と終了位置を見つけました。この問題を解決するには?

xml 入力:

    <?xml version="1.0" encoding="UTF-8"?>
    <passengerlist>
      <passengers>
        <Firstname>JOHNNNNNNNNNNNN</Firstname>
        <lastname>MARKKKKKKKKKKKK</lastname>
        <comments>abcdefh abc abcde abc dekf jl</comments>
         <route>air</route>
      </passengers>
    <!-- <passengers>
      <Firstname>ANTONYYYYYYYYYYY</Firstname>
      <lastname>NORMAN</lastname>
      <comments>abcdefddddddddghhhhhhhhhhhhhh</comments>
      <route>air</route>
    </passengers>
    <passengers>
      <Firstname>BRITTOOOOOOOOOO</Firstname>
      <lastname>MARKKKKKKK</lastname>
      <comments>abcdedfffghghghghghghghghghghghghgh</comments>
      <route>cruise</route>
     </passengers> -->
   </passengerlist>

XSLT コード:

  <!-- For line Wrapping -->

  <xsl:template name="callEmpty">
    <xsl:param name="callEmpty"/>
    <xsl:variable name="LNemptyCheck" select="$callEmpty"></xsl:variable>
  </xsl:template> 

  <xsl:template name="text_wrapper">
    <xsl:param name="Text"/>
    <xsl:choose>
      <xsl:when test="string-length($Text)">
        <xsl:value-of select="substring($Text,1,15)"/>
        <xsl:if test="string-length($Text) &gt; 15">
          <xsl:value-of select="$newline"/>
        </xsl:if>
        <xsl:call-template name="wrapper_helper">
          <xsl:with-param name="Text" select="substring($Text,16)"/>   
        </xsl:call-template>
      </xsl:when>
    </xsl:choose>
  </xsl:template>

 <xsl:template name="wrapper_helper">
  <xsl:param name="Text"/>
  <xsl:value-of select="substring($Text,1,15)"/>
  <xsl:text>&#xa;</xsl:text>
  <xsl:call-template name="text_wrapper">
    <xsl:with-param name="Text" select="substring($Text,15)"/>
  </xsl:call-template>
 </xsl:template> 

 <!-- Template for Line wrapping --> 

 <xsl:template match="/">

 <xsl:for-each select="passengerlist/passengers">

   <xsl:value-of select="Firstname"/>
   <xsl:text> </xsl:text>
   <xsl:value-of select="lastname"/>
   <xsl:text> </xsl:text>
   <xsl:value-of select="route"/>
   <xsl:text> </xsl:text>
   <xsl:variable name="firstwrap">
     <xsl:if test="route='air'">

       <xsl:value-of select="Firstname"/>
       <xsl:text> </xsl:text>
       <xsl:value-of select="comments"/>
     </xsl:if>
   </xsl:variable>
   <xsl:call-template name="text_wrapper">
      <xsl:with-param name="Text" select="$firstwrap"/>
   </xsl:call-template>

出力:

JOHNNNNNNNNNNNN MARKKKKKKKKKKKKK air JOHNNNNNNNNNNNN abcdefh abc ab bcde abc dekf jl MARKKKKKKKKKKKKK abcdefh abc ab bcde abc dekf jl

予想外:

JOHNNNNNNNNNNNN MARKKKKKKKKKKKK エア JOHNNNNNNNNNNNN abcdefh abc ab bcde abc dekf jl MARKKKKKKKKKKKKK abcdefh abc abbcde abc dekf jl

私の問題を整理するのを手伝ってください。または、XSLT でそれは可能ですか?

4

1 に答える 1

1

あなたの問題が正確にはわかりません(得た出力と期待した出力の間に大きな違いは見られません)。しかし、もっとシンプルにすることは可能だと思います。テスト用の入力 xml をいくつか用意しました (デモンストレーション用に非常に単純なものです)。

<?xml version="1.0" encoding="UTF-8"?>
<Input>
    <Line>Some long text is on the first line.</Line>
    <Line>Some longer text is on the second line.</Line>
    <Line>But the longest text occures on the third line.</Line>
</Input>

次の xslt では、各行の処理結果 (つまり、テキストのコピーと、いくつかの条件に基づく追加テキストの追加) を変数に格納します。次に、ユーザー関数を使用してこの変数を一度にラップします (名前付きテンプレートでも実行できます)。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:my="my-ns">
    <xsl:output method="text" />

    <xsl:variable name="newLineCharacter" select="'&#10;'" />
    <xsl:variable name="maxLineWidth" select="50" />

    <xsl:template match="/">
        <xsl:apply-templates select="Input/Line" />
    </xsl:template>

    <xsl:template match="Line">
        <!-- Process the line and store the result into variable-->
        <xsl:variable name="processedText">
            <xsl:value-of select="." />
            <xsl:text> </xsl:text>
            <xsl:if test="position() &gt;= 1">
                <xsl:text>First condition is true. </xsl:text>
            </xsl:if>
            <xsl:if test="position() &gt;= 2">
                <xsl:text>Second condition is true. </xsl:text>
            </xsl:if>
            <xsl:if test="position() &gt;= 3">
                <xsl:text>Third condition is true. </xsl:text>
            </xsl:if>                   
            <!-- et cetera, et cetera ...-->
        </xsl:variable>
        <!-- Wrap the text stored in a variable -->
        <xsl:value-of select="my:wrapText($processedText, $maxLineWidth)" />
    </xsl:template>

    <xsl:function name="my:wrapText">
        <xsl:param name="textToBeWrapped" />
        <xsl:param name="maximumWidth" />

        <xsl:value-of select="substring($textToBeWrapped,1,$maximumWidth)" />
        <xsl:value-of select="$newLineCharacter" />

        <xsl:if test="string-length($textToBeWrapped) &gt; $maximumWidth">
            <!-- Recursive call of my:wrapText to wrap the rest of the text -->
            <xsl:value-of select="my:wrapText(substring($textToBeWrapped,$maximumWidth+1), $maximumWidth)" />
            </xsl:if>
    </xsl:function>

</xsl:stylesheet>

そして、出力は

Some long text is on the first line. First conditi
on is true. 
Some longer text is on the second line. First cond
ition is true. Second condition is true. 
But the longest text occures on the third line. Fi
rst condition is true. Second condition is true. T
hird condition is true. 

あなたのニーズを満たすことを願っています。

于 2013-07-14T14:22:04.370 に答える