2011-02-09 21 views
1

こんにちはすべて 私はxslt 1.0を使用しています。対応する文字として表示する必要があるFOA7という文字コードがあります。はxsltにcharを表示する必要があります

... 'A decimal representation must immediately follow the "&#" in a character reference.'

事前にthis..Thanksを固定して私を助けてください:私の入力は私のXSLTテンプレートは、それはエラーとしてエラーを示す

<xsl:template match="w:sym"> 
    <xsl:variable name="char" select="@w:char"/> 
    <span font-family="{@w:fonts}">   
    <xsl:value-of select="concat('&#x',$char,';')"/> 
    </span> 
</xsl:template> 

ある

<w:sym w:font="Wingdings" w:char="F0A7"/>

です

+0

私の答え、どうやって__can__、そして@Eamon Nerbonneの答えを参照してください、どうしてあなたはそれをまったく__shouldn't__しますか? – Flack

答えて

2

これは合理的なXSLTでは不可能です。あなたはそれを回避することができます。 concat

  • あなたの解決策は無効です:XSLTはちょうど空想文字列結合演算子はありませんが、それは本当に概念ツリーを変換します。このよう&#xf0a7;としてエンコードされた文字は単一の文字である - 文字列ではありません - あなたは何とか手紙&#xf0a7;を含めるようにしたならば、XSLTプロセッサは、XMLデータにこれらの文字を含めることが必要とされるであろう!それはそれがそれらを逃れることを意味します。
  • XSLT 1.0には、数字からそのコードポイントを持つ文字に変換する機能はありません。
  • XSLT 2.0では、Michael Kay氏が指摘しているように、これを実現するにはcodepoints-to-string()を使用できます。

2つの解決策があります。まず、disable-output-escapingを使用できます。これはむしろ厄介で、は携帯ではありません。できるだけこれを避けてください。しかし、おそらくあなたの変圧器ではうまくいくでしょう。おそらく唯一の一般的でシンプルな解決策なので、これを避けることはできません。

第2の解決方法は、個々の文字ごとにハードコードを一致させることです。それは一般的に混乱ですが、あなたの特定の問題に依存する限られた可能性を扱っているなら、かなり可能です。

最後に、ではなく、でXSLTでこの問題を解決することをお勧めします。これは通常、別のプログラミング環境で前後の処理をより適切に行うことができます。たぶん、XSLTを最初に使用できるようにするXML文書のメモリ内表現があります。この場合、CPU時間がかかりません。

+0

+1。私は同意するが、解決策は単純だと思われるが、結果は非常に難しい。 XML設計がうまくいけば、この質問は決して起こりません。 – Flack

+0

Earmon Nerbonne:あなたは*「これは合理的なXSLTでは不可能です」*と書いています。 Michael Kay博士がXPath/XSLT 2.0関数(codepoints-to-string())(http://www.w3.org/2005/xpath-functions/#codepoints-to-string)に答えているので、間違っている –

+0

見落としてしまったかもしれないので、XSLT 2.0のオプションを箇条書きのポイントの1つとして挙げました。 –

2
<span font-family="{@w:font}"> 
    <xsl:value-of select="concat('&amp;#x', @w:char, ';')" 
     disable-output-escaping="yes"/> 
</span> 

ただし、@Eamon Nerbonne's答え、なぜあなたはそれをまったくやってはいけないのですか?

+0

ええ;この*特定の例ではこれが唯一の方法かもしれませんが、それはまったく理想的ではありません。 –

0

'& amp;' '&'の出力:

<xsl:value-of select="concat('&amp;#x',$char,';')"/> 
+0

これはブラウザに '&#xF0A7'と表示されます。 – Flack

+0

あなたは正しいです。 +1 –

1

XSLT 2.0を使用していない場合は、16進数を10進数に変換する関数を記述し、結果にcodepoints-to-string()を使用できます。

+0

+1一般的な正解。 XSLT 2.0の更新を妨げるものはありません。 –

+0

@Alejandro。あなたはかなり正しくはありません:( – Flack

+0

@Flack:例? –

関連する問題