2

出力HTMLに保持したいラインフィード、スペース、タブを含むXMLのデータがありましたが(<p>は使用できませんでした)、画面の横に達したときに行を折り返す必要もありました。 (したがって、<pre>を使用できませんでした)。

4

4 に答える 4

1

別の言い方をすれば、スペースのすべてのペアを 2 つの改行しないスペースに、タブを 4 つの改行しないスペースに、すべての改行を<br>要素に変換したいということです。XSLT 1.0 では、次のようにします。

<xsl:template name="replace-spaces">
  <xsl:param name="text" />
  <xsl:choose>
    <xsl:when test="contains($text, '  ')">
      <xsl:call-template name="replace-spaces">
        <xsl:with-param name="text" select="substring-before($text, '  ')"/>
      </xsl:call-template>
      <xsl:text>&#xA0;&#xA0;</xsl:text>
      <xsl:call-template name="replace-spaces">
        <xsl:with-param name="text" select="substring-before($text, '  ')" />
      </xsl:call-template>
    </xsl:when>
    <xsl:when test="contains($text, '&#x9;')">
      <xsl:call-template name="replace-spaces">
        <xsl:with-param name="text" select="substring-before($text, '&#x9;')"/>
      </xsl:call-template>
      <xsl:text>&#xA0;&#xA0;&#xA0;&#xA0;</xsl:text>
      <xsl:call-template name="replace-spaces">
        <xsl:with-param name="text" select="substring-before($text, '&#x9;')" />
      </xsl:call-template>
    </xsl:when>
    <xsl:when test="contains($text, '&#xA;')">
      <xsl:call-template name="replace-spaces">
        <xsl:with-param name="text" select="substring-before($text, '&#xA;')" />
      </xsl:call-template>
      <br />
      <xsl:call-template name="replace-spaces">
        <xsl:with-param name="text" select="substring-after($text, '&#xA;')" />
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$text" />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

末尾再帰を使用できないのは少し面倒ですが、テキストが非常に長い場合を除き、実際の問題にはなりません。

XSLT 2.0 ソリューションでは、<xsl:analyze-string>.

于 2008-09-18T13:51:18.633 に答える
0

私と同僚(Patricia Eromosele)は、次の解決策を考え出しました:(より良い解決策はありますか?)

    <p> 
<xsl:call-template name = "prewrap">
<xsl:with-param name = "text" select = "text" />
</ xsl:call-template>
</ p>



<xsl:template name = "prewrap">
<xsl:param name = "text"select="。"/>
<xsl:variable name = "spaceIndex" select = "string-length(substring-before($ text、''))" / >
<xsl:variable name = "tabIndex" select = "string-length(substring-before($ text、'&#x09;'))" />
<xsl:variable name = "lineFeedIndex" select = "string-length (substring-before($ text、'&#xA;')) "/>
<xsl:choose>
<xsl:when test = "$ spaceIndex = 0 and $ tabIndex = 0 and $ lineFeedIndex = 0"> <!-特殊文字は残っていません->
<xsl:value-of select = "$ text" />
</ xsl:when>
<xsl:when test = "$ spaceIndex>$tabIndexおよび$lineFeedIndex>$ tabIndex"> <!-tab->
<xsl :value-of select = "substring-before($ text、'&#x09;')" />
<xsl:text disable-output-escaping = "yes">&amp; nbsp; </ xsl:text>
<xsl :text disable-output-escaping = "yes">&amp; nbsp; </ xsl:text>
<xsl:text disable-output-escaping = "yes">&amp; nbsp; </ xsl:text>
<xsl:text disable-output-escaping = "yes">&amp; nbsp; </ xsl:text>
<xsl:call-template name = "prewrap">
<xsl:with-param name = "text" select = "substring-after($ text、'&#x09;')" />
</ xsl:call-template>
</ xsl:when>
<xsl:when test = "$ spaceIndex>$lineFeedIndexおよび$tabIndex>$ lineFeedIndex"> <!-ラインフィード->
<xsl:value-of select = "substring-before($ text、'&#xA; ') "/>
<br/>
<xsl:call-template name =" prewrap">
<xsl:with-param name =" text "select =" substring-after($ text、'&#xA;') " />
</ xsl:call-template>
</ xsl:when>
<xsl:when test = "$ lineFeedIndex>$spaceIndexおよび$tabIndex>$ spaceIndex"> <!-2つのスペース->
<xsl:value- of select = "substring-before($ text、'')" />
<xsl:text disable-output-escaping = "yes ">&amp; nbsp; </ xsl:text>
<xsl:text disable-output-escaping =" yes ">&amp; nbsp; </ xsl:text>
<xsl:call-template name =" prewrap">
<xsl:with-param name = "text" select = "substring-after($ text、'')" />
</ xsl:call-template>
</ xsl:when>
<xsl:otherwise> <!-決して起こらないはずです->
<xsl:value-of select = "$ text" />
</ xsl:otherwise>
</ xsl:choose>
</ xsl:template>

ソース: http: //jamesjava.blogspot.com/2008/06/xsl-preserving-line-feeds-tabs-and.html

于 2008-09-17T20:20:40.517 に答える
0

これが関連しているかどうかはわかりませんが、xml には preservespace 属性などはありませんか?

于 2008-09-17T20:32:09.397 に答える
0

実際、私はこれを正しくサポートするエディターを選び、より多くの XML を介して論争するのではありません。

于 2008-09-17T20:25:03.780 に答える