Cara memasukkan & nbsp; di XSLT

207

Bagaimana saya bisa memasukkan

 

Ke dalam stylesheet XSLT, saya terus mendapatkan kesalahan ini:

Kesalahan Parsing XML: entitas tidak terdefinisi

Pada dasarnya saya ingin karakter spasi yang tidak melanggar dalam Template XSLT.

JL.
sumber
2
Anda juga dapat menggunakan & # xA0; sama dengan & # 160; lihat di sini stackoverflow.com/questions/7511214/…
user3766111

Jawaban:

337

Gunakan kode entitas  sebagai gantinya.

 adalah "referensi entitas karakter" HTML. Tidak ada entitas yang dinamai untuk ruang bebas-patah dalam XML, jadi Anda menggunakan kode  .

Wikipedia menyertakan daftar entitas XML dan HTML , dan Anda dapat melihat bahwa hanya ada 5 "entitas yang ditentukan sebelumnya" dalam XML, tetapi HTML memiliki lebih dari 200 entitas. Saya juga akan mengarahkan ke Membuat spasi (& nbsp;) di XSL yang memiliki jawaban yang sangat bagus

brabster
sumber
3
Kami mengalami situasi baru-baru ini di mana hanya dalam satu dari banyak XSL berhenti bekerja dengan teknik ini, dan mulai menunjukkan karakter yang aneh. Namun, jika saya menggunakan teknik CDATA WaterSoul itu berfungsi.
@BrianReindel, itu mungkin berarti bahwa Anda menggunakan referensi entitas numerik yang salah, yaitu Šalih-alih  , yang terakhir yang akan selalu menyelesaikan ke ruang non-breaking Unicode.
Abel
Tautan Top Ten Java dan XSLT Tips sangat berguna.
LCJ
<xsl: text> & # 160; </ xsl: text> itu memisahkan dua bidang
Manash Ranjan Dakua
1
Tautannya sudah busuk.
GSerg
37

&#160;bekerja dengan sangat baik. Namun, itu akan menampilkan salah satu karakter aneh dalam pengkodean ANSI. <xsl:text>bekerja paling baik untuk saya.

<xsl:text> </xsl:text>
Saroj
sumber
3
Menggunakan jawaban yang diterima saya berakhir dengan garis pemisah ruang dalam output XML saya (setidaknya seperti apa itu di editor XML VS2010). Dengan menggunakan jawaban ini saya mendapatkan tepat 1 ruang saja.
Mathijs Flietstra
1
@ Matthijs, ini adalah ruang, bukan ruang non-breaking, yang tidak sama. Jika VS menunjukkannya secara tidak benar, periksa enkode Anda (VS benar-benar mampu menunjukkan ini dengan benar dan itu harus enkode independen, jadi semakin besar kemungkinan Anda melakukan sesuatu yang salah).
Abel
25

Anda juga dapat melakukan ini:

<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>
WaterSoul
sumber
2
Ini akan berfungsi jika prosesor mendukungdisable-output-escaping , yang tidak diharuskan dan sudah tidak digunakan lagi di XSLT 2.0 dan lebih lagi di 3.0. Dalam versi ini, Anda dapat mencapai efek yang sama dengan xsl:character-mapdijamin untuk bekerja lintas-prosesor. Juga, ini menempatkan entitas bernama &nbsp;dalam output, yang tidak harus sama dengan ruang non-breaking dan penerima harus mendeklarasikan entitas ini (dalam HTML biasanya implisit).
Abel
21

Gunakan ini

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

sunting: Downvoters mungkin harus memvalidasi bahwa ini berfungsi lebih dulu (ya, dan merupakan solusi paling umum untuk masalah tersebut.)

jagprinderdeep
sumber
1
Tidak yakin, tapi saya sudah menguji pendekatan saya dan itu berhasil, jadi saya tidak yakin apa downvote itu untuk :(
jagprinderdeep
2
Juga, jawaban yang diterima tidak akan valid untuk semua parser sesuai dengan halaman yang ditautkan; just a heads up
jagprinderdeep
1
Saya telah memberikan alasan untuk downvote saya sebelumnya, tetapi jika saya untuk downvote jawaban ini , maka alasannya adalah - itu menjawab pertanyaan yang salah. OP dengan jelas bertanya bagaimana memasukkan ruang yang tidak bisa dipecahkan, menggunakan xslt dan Anda menjawab bagaimana menempatkan urutan ampersand-nbsp-semicolon. Dan bertengkar karena downvotes juga tidak biasa. Tapi serius, pernahkah Anda mengatakan itu tentang CDATA?
Michael Krelin - hacker
1
Oke, jagprinderdeep, saya mencabut downvote saya, tetapi sebagai imbalannya silakan kunjungi saya begitu saya mencapai rumah sakit jiwa. (perhatikan bahwa saya tidak mengembalikan Anda karena alasan baru). Tetapi mengerti bahwa Anda menjawab pertanyaan yang salah. Saya pikir itulah alasan di balik downvote lainnya.
Michael Krelin - hacker
8
Saya juga downvoted karena Anda tidak dapat menjamin pihak penerima akan mendeklarasikan & nbsp ;. Jika Anda bekerja dengan xslt + html, maka ya, ini adalah cara untuk melakukannya, meskipun peretasan. Tetapi, jika Anda menggunakan xslt untuk menghasilkan xml lain, maka itu hanya akan meledak pada Anda.
Doug
14

Anda mungkin ingin menambahkan definisi untuk entitas ini di awal file (di bawah deklarasi xml):

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

Anda juga dapat menambahkan lebih banyak entitas seperti Ntilde, Aacute, dll.

victor hugo
sumber
5

Selain jawaban victor hugo, dimungkinkan untuk mendapatkan semua referensi karakter yang dikenal legal dalam file XSLT, seperti ini:

<!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>

Ada juga perbedaan tertentu dalam hasil pendekatan ini dibandingkan dengan <xsl:text disable-output-escaping="yes">satu. Yang terakhir akan menghasilkan string literal seperti &nbsp;untuk semua jenis output, bahkan untuk <xsl:output method="text">, dan ini mungkin berbeda dari apa yang Anda inginkan ... Sebaliknya, mendapatkan entitas yang ditentukan untuk template XSLT melalui <!DOCTYPE ... <!ENTITY ...akan selalu menghasilkan output yang konsisten dengan xsl:outputpengaturan Anda .

Dan ketika menyertakan semua referensi karakter, mungkin bijaksana untuk menggunakan resolver entitas lokal untuk menjaga mesin XSLT dari mengambil definisi entitas karakter dari Internet. Pengguna JAXP atau Xalan-J eksplisit mungkin perlu patch untuk Xalan-J untuk menggunakan resolver dengan benar. Lihat blog saya XSLT, entitas, Java, Xalan ... untuk mengunduh patch dan komentar.

Sergey Ushakov
sumber
1
Perhatikan bahwa baru-baru ini, W3 mulai memblokir terlalu banyak permintaan untuk tautan tersebut dan yang serupa jika berasal dari proses otomatis. Tempatkan file itu secara lokal atau di server Anda dan sesuaikan URL sesuai dan Anda akan baik-baik saja. Selain itu, +1, dan solusi terbaik untuk menggunakan entitas bernama HTML.
Abel
Catatan yang bagus, dan ada juga alasan lain untuk memiliki salinan file lokal dengan definisi entitas, karena jika tidak proses XSLT kemungkinan akan gagal jika koneksi internet tidak tersedia. Di dunia Java tidak perlu meretas URL, karena dimungkinkan untuk mengatur EntityResolver , dan Apache XML Commons Resolver mungkin merupakan kandidat yang baik. Platform pemrograman lain kemungkinan memiliki teknik yang sama juga ...
Sergey Ushakov
Ya, jadi untuk referensi, untuk dotnetters: Metode abstrak ResolveEntity untuk entitas dan XmlResolver memuat sumber daya eksternal , yang setara dengan .NET untuk metode Java ini .
Abel
2

Saat Anda menggunakan yang berikut (tanpa disable-output-escaping!) Anda akan mendapatkan satu ruang tanpa putus:

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

Shaam
sumber
4
Anda tidak perlu disable-output-escapinguntuk ini
Ian Roberts
2

Lembar gaya XSLT harus berbentuk XML dengan baik. Karena "&nbsp;"bukan salah satu dari lima entitas XML yang telah ditentukan , ia tidak dapat secara langsung dimasukkan dalam stylesheet. Jadi kembali ke solusi Anda "&#160;"adalah pengganti sempurna yang "&nbsp;"harus Anda gunakan.

Contoh:

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

Anda juga bisa menggunakan:

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

ingat amp setelah & & Anda akan mendapatkan pesan kesalahan

Mattia Vio
sumber
Ini akan menampilkan &amp;nbsp;(dengan asumsi Anda bermaksud titik koma ada di sana), yang akan dirender sebagai &nbsp;, bukan sebagai `` (nb-space).
Abel
0

Saya mencoba untuk menampilkan batas pada sel kosong di tabel HTML. Trik lama saya menggunakan ruang non-breaking dalam sel kosong tidak bekerja dari xslt. Saya menggunakan line break dengan efek yang sama. Saya menyebutkan ini kalau-kalau alasan Anda mencoba menggunakan ruang non-breaking adalah untuk memberikan beberapa konten ke sel tabel 'kosong' untuk mengaktifkan batas sel.

<br/>
BH
sumber
Saya memiliki skenario yang sama, dan ini tampaknya berhasil membuat sel tabel untuk di-render.
Richard Moore
0

Coba gunakan

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

Tetapi itu tergantung pada prosesor XSLT yang Anda gunakan: spesifikasi XSLT tidak memerlukan prosesor XSLT untuk mengubahnya menjadi " &nbsp;".

Viacheslav
sumber
0

Meskipun jawaban sudah diberikan oleh @brabster dan lainnya.
Saya pikir solusi yang lebih dapat digunakan kembali adalah:

<xsl:variable name="space">&#160;</xsl:variable>
...
<xsl:value-of select="$space"/>
Leonid Dashko
sumber