出力HTMLに保持したいラインフィード、スペース、タブを含むXMLのデータがありましたが(<p>は使用できませんでした)、画面の横に達したときに行を折り返す必要もありました。 (したがって、<pre>を使用できませんでした)。
James A. N. Stauffer
質問する
5548 次
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>  </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, '	')">
<xsl:call-template name="replace-spaces">
<xsl:with-param name="text" select="substring-before($text, '	')"/>
</xsl:call-template>
<xsl:text>    </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, '
')">
<xsl:call-template name="replace-spaces">
<xsl:with-param name="text" select="substring-before($text, '
')" />
</xsl:call-template>
<br />
<xsl:call-template name="replace-spaces">
<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>
末尾再帰を使用できないのは少し面倒ですが、テキストが非常に長い場合を除き、実際の問題にはなりません。
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 に答える