XSLT разделить текст на линии фиксированной ширины - PullRequest
1 голос
/ 18 января 2012

У меня есть текст, который я хочу обработать с помощью XSLT.Прямо сейчас весь мой текст урезан до 40 символов, например:

<xsl:call-template name="justify">
  <xsl:with-param name="value" select="comment"/>
  <xsl:with-param name="width" select="40"/>
  <xsl:with-param name="align" select=" 'center' "/>
</xsl:call-template>

Но теперь я хотел бы отобразить весь текст во многих строках, каждая из которых содержит 40 символов.Как этого достичь?Анжела

Вот шаблоны, которые я использую:

  <xsl:template name="justify">
    <xsl:param name="value" />
    <xsl:param name="width" select="10"/>
    <xsl:param name="align" select=" 'left' "/>

    <xsl:variable name="output" select="substring($value,1,$width)"/>

    <xsl:choose> 
      <xsl:when test="$align = 'center'">
        <xsl:call-template name="dup">
          <xsl:with-param name="input" select=" ' ' "/>
          <xsl:with-param name="count"
            select="floor(($width - string-length($output)) div 2)"/>
        </xsl:call-template>
        <xsl:value-of select="$output"/>
        <xsl:call-template name="dup">
          <xsl:with-param name="input" select=" ' ' "/>
          <xsl:with-param name="count"
            select="ceiling(($width - string-length($output)) div 2)"/>
        </xsl:call-template>
      </xsl:when>
    </xsl:choose>
  </xsl:template>

  <xsl:template name="dup">
    <xsl:param name="input"/>
    <xsl:param name="count" select="1"/>
    <xsl:choose>
      <xsl:when test="not($count) or not($input)"/>
      <xsl:when test="$count = 1">
        <xsl:value-of select="$input"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:if test="$count mod 2">
          <xsl:value-of select="$input"/>
        </xsl:if>
        <xsl:call-template name="dup">
          <xsl:with-param name="input"
               select="concat($input,$input)"/>
          <xsl:with-param name="count"
               select="floor($count div 2)"/>
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

И XML очень прост:

<Receipt>
 <store>
    <name>This is my new store</name> 
    <storeID>10000</storeID> 
    <addressline /> 
  </store>

  <transaction>
    <!-- some other nodes hier-->
  </transaction>

  <comment>Here comes a very long comment that needs to be displayed on many lines, 40 chars each.</comment>   
</Receipt>

Я использовал что-то вроде этого

    <xsl:template name="for">
      <xsl:param name="value"/>
      <xsl:param name="start">1</xsl:param>
      <xsl:param name="stop"/>
      <xsl:param name="step">40</xsl:param>
      <xsl:text/>
      <xsl:if test="$start &lt; $stop">
         <xsl:call-template name="justify">
            <xsl:with-param name="value" select="substring($value,$start,$step)"/>
            <xsl:with-param name="width" select="40"/>
            <xsl:with-param name="align" select=" 'center' "/>
        </xsl:call-template>  
          <xsl:text>
</xsl:text>         

        <xsl:call-template name="for">  
          <xsl:with-param name="value">
            <xsl:value-of select="$value"/>
          </xsl:with-param> 
          <xsl:with-param name="stop">
            <xsl:value-of select="$stop"/>
          </xsl:with-param>
          <xsl:with-param name="start">
            <xsl:value-of select="$start + $step"/>
          </xsl:with-param>
        </xsl:call-template>
      </xsl:if>
    </xsl:template>

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

Есть ли более простые решения?

1 Ответ

1 голос
/ 19 января 2012

Я использовал что-то вроде этого

    <xsl:template name="for">
      <xsl:param name="value"/>
      <xsl:param name="start">1</xsl:param>
      <xsl:param name="stop"/>
      <xsl:param name="step">40</xsl:param>
      <xsl:text/>
      <xsl:if test="$start &lt; $stop">
         <xsl:call-template name="justify">
            <xsl:with-param name="value" select="substring($value,$start,$step)"/>
            <xsl:with-param name="width" select="40"/>
            <xsl:with-param name="align" select=" 'center' "/>
        </xsl:call-template>  
          <xsl:text>
</xsl:text>         

        <xsl:call-template name="for">  
          <xsl:with-param name="value">
            <xsl:value-of select="$value"/>
          </xsl:with-param> 
          <xsl:with-param name="stop">
            <xsl:value-of select="$stop"/>
          </xsl:with-param>
          <xsl:with-param name="start">
            <xsl:value-of select="$start + $step"/>
          </xsl:with-param>
        </xsl:call-template>
      </xsl:if>
    </xsl:template>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...