web-dev-qa-db-ja.com

XSLTで復帰を実装する方法

Xslt内にキャリッジリターンを実装したい。問題は、変数が1つあることです。ステップ1 =値1のブレークタグステップ2 =文字列としての値2で、次のように表示したい

ステップ1 =値1

ステップ2 =値2

hTMLフォームではなく、ページにbrタグが表示されています。xslで改行/キャリッジリターンを実装する良い方法はありがたいです

21
chugh97

Environment.NewLineで値を分離し、htmlのpreタグを使用して、探していた効果をエミュレートしました

0
chugh97

の代替として

<xsl:text>
</xsl:text>

使用できます

<xsl:text>&#10;</xsl:text> <!-- newline character -->

または

<xsl:text>&#13;</xsl:text> <!-- carriage return character -->

インデントを台無しにしたくない場合

42
Steef

xsl:text要素で単純なキャリッジリターンを使用する

<xsl:text>
</xsl:text>
4
Pierre

多くの人が好むように、式にエスケープシーケンスを直接埋め込んだり、変数内に奇妙な改行を入れたりすることなく、これに対するニースのソリューションを探していました。次のような変数内にテキストノードを埋め込むことで、この両方のアプローチのハイブリッドが実際に機能することがわかりました。

<xsl:variable name="newline"><xsl:text>&#10;</xsl:text></xsl:variable>
<xsl:value select="concat(some_element, $newline)" />

これのもう1つの良い副作用は、LF、CR、または両方のCRLFであっても、必要な改行を渡すことができることです。

-ダニエル

3
Daniel

私が見つけた最もクリーンな方法は、!ENTITY改行、タブ、およびその他の一般的なテキスト構成のスタイルシートの上部にある宣言。多数のフォーマット要素を出力に挿入する必要がある場合、これにより変換シートがよりきれいに見えます。

例えば:

<?xml version="1.0"?>
<!DOCTYPE xsl:stylesheet [
    <!ENTITY nl "<xsl:text>
</xsl:text>">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="step">
    &nl;&nl;
    <xsl:apply-templates  />
  </xsl:template>

...

3
Como

キャリッジリターンが必要な行の最後でこれを試してください。それは私のために働いた。

<xsl:text><![CDATA[<br />]]></xsl:text>
3
Ken

これは、データベースからの文字列で&#10;を探し、その前に部分文字列を出力する再帰的なテンプレートを使用するアプローチです。 &#10;の後に部分文字列が残っている場合、テンプレートは、何もなくなるまで自分自身を呼び出します。 &#10;が存在しない場合、テキストは単に出力されます。

テンプレート呼び出しは次のとおりです(@ActivityExtDescriptionをデータベースフィールドに置き換えるだけです)。

<xsl:call-template name="MultilineTextOutput">
    <xsl:with-param name="text" select="@ActivityExtDescription" />
</xsl:call-template>

そして、テンプレート自体のコードは次のとおりです。

<xsl:template name="MultilineTextOutput">
<xsl:param name="text"/>
<xsl:choose>
    <xsl:when test="contains($text, '&#10;')">
        <xsl:variable name="text-before-first-break">
            <xsl:value-of select="substring-before($text, '&#10;')" />
        </xsl:variable>
        <xsl:variable name="text-after-first-break">
            <xsl:value-of select="substring-after($text, '&#10;')" />
        </xsl:variable>

        <xsl:if test="not($text-before-first-break = '')">
            <xsl:value-of select="$text-before-first-break" /><br />
        </xsl:if>

        <xsl:if test="not($text-after-first-break = '')">
            <xsl:call-template name="MultilineTextOutput">
                <xsl:with-param name="text" select="$text-after-first-break" />
            </xsl:call-template>
        </xsl:if>
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="$text" /><br />
    </xsl:otherwise>
</xsl:choose>

チャームのように動作します!!!

1
Jens Hupkau

私はあなたがこれにxsl:textタグを使用できると信じています

<xsl:text>
</xsl:text>

終了タグを独自の行に配置することにより、改行がリテラルテキストの一部となり、そのまま出力される可能性があります。

0
Frerich Raabe