挿入方法  XSLT


207

どうすれば挿入できますか

 

XSLTスタイルシートで、次のエラーが発生します。

XML解析エラー:未定義のエンティティ

基本的に、XSLTテンプレートに改行しないスペース文字が必要です。


2
 を使用することもできます。 と同じ ここを見てstackoverflow.com/questions/7511214/...
user3766111

回答:


336

 代わりにエンティティコードを使用してください。

 HTMLの「文字エンティティ参照」です。XMLの非改行スペースの名前付きエンティティはないため、コードを使用します 

ウィキペディアにはXMLおよびHTMLエンティティのリストが含まれており、XMLには5つの「定義済みエンティティ」しかないことがわかりますが、HTMLには200を超えています。また、XSLでのスペースの作成( )素晴らしい答え。


3
最近、多くのXSLのうちの1つだけでこのテクニックを使用できなくなり、奇妙なキャラクターを表示する状況に遭遇しました。ただし、WaterSoulのCDATAテクニックを使用すると機能します。

@BrianReindel、これはおそらく、間違った数値エンティティ参照を使用したことを意味します。つまり、のŠ代わりに 、後者は常にUnicode非改行スペースに解決されます。
Abel

Top Ten Java and XSLT Tips」のリンクは本当に便利です。
LCJ、2016

<xsl:text>&#160; </ xsl:text> 2つのフィールドを分離します
Manash Ranjan Dakua

1
リンクが壊れています。
GSerg

37

&#160;本当にうまくいきます。ただし、ANSIエンコーディングでこれらの奇妙な文字の1つが表示されます。<xsl:text>私にとって最も効果的でした。

<xsl:text> </xsl:text>

3
受け入れられた回答を使用して、XML出力に改行スペースができました(少なくとも、VS2010のXMLエディターではそれが表示されていました)。この回答を使用すると、正確に1つのスペースしか得られません。
Mathijs Flietstra 2014年

1
@Matthijs、これはスペースであり、改行しないスペースではなく、同じではありません。VSが正しく表示しない場合は、エンコーディングを確認してください(VSはこれを正しく表示でき、エンコーディングに依存しないため、他の問題が発生している可能性があります)。
アベル

25

これを行うこともできます:

<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>

2
これは、プロセッサがをサポートしてdisable-output-escapingいる場合に機能します。これは必須ではなく、XSLT 2.0では廃止され、3.0では廃止されました。これらのバージョンでは、xsl:character-mapクロスプロセッサでの動作が保証された同じ効果が得られます。また、これにより、名前付きエンティティ&nbsp;が出力に配置されます。これ改行なしスペース同じである必要はなく、受信側でこのエンティティを宣言する必要があります(通常、HTMLでは暗黙的に行われます)。
アベル

21

これを使って

<xsl:text disable-output-escaping="yes">&amp;</xsl:text>nbsp;

編集:ダウンボーターはおそらくこれが最初に機能することを検証する必要があります(機能し、問題に対する最も一般的な解決策です)。


1
確かではありませんが、私は自分のアプローチをテストし、それが機能するので、反対投票が何であったかわかりません:(
jagprinderdeep

2
また、リンクされたページによると、受け入れられた回答はすべてのパーサーに対して有効ではありません。ちょうどヘッドアップ
jagprinderdeep

1
私は以前に自分の反対票の理由を示しましたが、私がこの回答に反対票を投じる場合、その理由は-それは間違った質問に答えます。OPは、xsltを使用して、分割できないスペースに配置する方法を明確に尋ね、アンパサンド-nbsp-セミコロンシーケンスを配置する方法に答えました。また、反対票をめぐる争いも見逃されています。しかし、真剣に、CDATAについてこれまで一度も言ったことはありませんか?
マイケルクレリン-ハッカー

1
わかりました、jagprinderdeep、私は自分の反対票を取り消しますが、精神的庇護に当たったら、見に行ってください。(その新しい理由のために、私はあなたに反対票を返さないことに注意してください)。しかし、あなたが間違った質問に答えることを理解してください。それが他の反対投票の理由だったと思います。
マイケルクレリン-ハッカー、2009年

8
受信側が&nbsp;を宣言することを保証できないため、私も反対票を投じました。xslt + htmlで作業している場合、はい、これはハックではありますが、これを行う方法です。しかし、他のxmlを生成するためにxsltを使用している場合、それはあなたに爆発します。
ダグ

14

このエンティティの定義をファイルの先頭に追加することもできます(xml宣言の下)。

<!DOCTYPE stylesheet [
<!ENTITY nbsp  "&#160;" >
]>

また、Ntilde、Aacuteなどのエンティティを追加することもできます。


5

victor hugoの回答に加えて、次のように、既知のすべての文字参照をXSLTファイルで合法にすることができます。

<!DOCTYPE stylesheet [
  <!ENTITY % w3centities-f PUBLIC "-//W3C//ENTITIES Combined Set//EN//XML"
      "http://www.w3.org/2003/entities/2007/w3centities-f.ent">
  %w3centities-f;
]>
...
<xsl:text>&amp; &nbsp; &ndash;</xsl:text>

また、このアプローチの結果には、<xsl:text disable-output-escaping="yes">1つと比較して特定の違いがあります。後者は&nbsp;、すべての種類の出力の場合と同様に、文字列リテラルを生成します<xsl:output method="text">。これは、希望するものとは異なる場合があります...逆に、XSLTテンプレートにエンティティを定義する<!DOCTYPE ... <!ENTITY ...と、常に以下と一致する出力が生成されます。あなたのxsl:output設定。

また、すべての文字参照を含める場合は、ローカルエンティティリゾルバーを使用して、XSLTエンジンがインターネットから文字エンティティ定義をフェッチしないようにするのが賢明です。JAXPまたは明示的なXalan-Jユーザーは、リゾルバーを正しく使用するためにXalan-Jのパッチが必要になる場合があります。パッチのダウンロードとコメントについては、私のブログXSLT、エンティティ、Java、Xalan ...を参照してください。


1
最近、W3は、自動化されたプロセスからのものである場合、それらのリンクや同様のリンクへのあまりにも多くのリクエストをブロックし始めました。そのファイルをローカルまたはサーバーに配置し、それに応じてURLを調整すれば問題ありません。それ以外は、+ 1、およびHTML名前付きエンティティを使用するための優れたソリューションです。
Abel

良いことに、エンティティ定義を含むファイルのローカルコピーを作成する別の理由もあります。そうしないと、インターネット接続が利用できない場合にXSLTプロセスが失敗する可能性があります。Javaの世界では、EntityResolverを手配することが可能であり、Apache XML Commons Resolverが良い候補となる可能性があるため、URLをハックする必要はありません。他のプログラミングプラットフォームにも同様の手法がある可能性があります...
セルゲイウシャコフ

はい、そうです、参考として、dotnetters:エンティティのResolveEntity抽象メソッドおよび外部リソースをロードするXmlResolverは、これらのJavaメソッドと同等.NETです。
Abel

2

以下を使用すると(disable-output-escaping!なしで)、改行なしの単一のスペースが得られます。

<xsl:text>&#160;</xsl:text>


4
disable-output-escapingこれは必要ありません
Ian Roberts

2

XSLTスタイルシートは整形式のXMLである必要があります。は5つの定義済みXMLエンティティの"&nbsp;" 1つではないため、スタイルシートに直接含めることはできません。したがって、ソリューションに戻ることは、使用すべき完全な代替品です。"&#160;""&nbsp;"

例:

<xsl:value-of select="$txtFName"/>&#160;<xsl:value-of select="$txtLName"/>

0

あなたも使うことができます:

<xsl:value-of select="'&amp;nbsp'"/>

&の後のアンプを覚えておいてください。そうしないと、エラーメッセージが表示されます。


これは、出力する&amp;nbsp;(セミコロンがそこにあると想定した場合)、&nbsp;``(nb-space)ではなくとしてレンダリングされます。
Abel、

0

HTMLテーブルの空のセルに境界線を表示しようとしました。空のセルで改行しないスペースを使用する私の古いトリックは、xsltからは機能しませんでした。同じ効果で改行しました。改行しないスペースを使用しようとした理由がセルの境界線をオンにするために「空の」テーブルセルにコンテンツを提供するためであった場合に備えて、これについて言及します。

<br/>

私は同様のシナリオを持っていますが、これはテーブルのセルをレンダリングするのに役立つようです。
Richard Moore

0

使ってみる

<xsl:text>&#160;</xsl:text>

ただし、使用しているXSLTプロセッサによって異なります。XSLT仕様では、XSLTプロセッサを " &nbsp;" に変換する必要はありません。


0

回答は、@ brabsterなどによってすでに提供されています。
より再利用可能なソリューションは次のようになると思います:

<xsl:variable name="space">&#160;</xsl:variable>
...
<xsl:value-of select="$space"/>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.