+1: ini lebih kuat daripada yang <xsl:text>mengandung pendekatan baris baru jika Anda menggunakan apa pun yang dapat memformat ulang file XSL Anda dan mengacaukan spasi.
Ian Roberts
49
Metode favorit saya untuk melakukan ini terlihat seperti:
<xsl:stylesheet><xsl:outputmethod='text'/><xsl:variablename='newline'><xsl:text></xsl:text></xsl:variable><!-- note that the layout there is deliberate -->
...
</xsl:stylesheet>
Lalu, setiap kali Anda ingin menampilkan baris baru (mungkin dalam csv), Anda dapat menampilkan sesuatu seperti berikut:
Harap perhatikan bahwa jawaban Florjon di bawah ini jauh lebih stabil daripada jawaban saya.
Nic Gibson
1
Mungkin perlu menambahkan deklarasi xml:space="preserve"ke xsl:textelemen untuk meningkatkan stabilitas, tetapi saya setuju bahwa jawaban @ Florjon mungkin lebih aman.
Flynn1179
Solusi ini memiliki kelemahan juga termasuk lekukan, yang mungkin tidak diinginkan.
wmassingham
47
Sertakan atribut Method = "teks" pada tag output xsl: dan sertakan baris baru dalam konten literal Anda di XSL pada titik yang sesuai. Jika Anda lebih suka menyimpan kode sumber XSL Anda rapi gunakan entitas di mana Anda ingin baris baru.
IMHO tidak ada info lebih dari @Florjon memberi diperlukan. Mungkin beberapa detail kecil dibiarkan untuk memahami mengapa kadang-kadang itu tidak berhasil bagi kita.
Pertama-tama, 
(hex) atau 
(dec) di dalam a <xsl:text/>akan selalu berfungsi, tetapi Anda mungkin tidak melihatnya.
Tidak ada baris baru dalam markup HTML. Menggunakan yang sederhana <br/>akan baik-baik saja. Kalau tidak, Anda akan melihat ruang putih. Melihat sumber dari browser akan memberi tahu Anda apa yang sebenarnya terjadi. Namun, ada beberapa kasus yang Anda harapkan perilaku ini, terutama jika konsumen tidak secara langsung browser. Misalnya, Anda ingin membuat halaman HTML dan melihat strukturnya diformat dengan baik dengan baris dan id kosong sebelum menyajikannya ke browser.
Ingat di mana Anda harus menggunakan disable-output-escapingdan di mana Anda tidak. Ambil contoh berikut ini di mana saya harus membuat xml dari yang lain dan mendeklarasikan DTD-nya dari stylesheet.
Versi pertama tidak luput dari karakter (default untuk xsl: teks)
<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><xsl:outputmethod="xml"indent="yes"encoding="utf-8"/><xsl:templatematch="/"><xsl:text><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


</xsl:text><xsl:copy><xsl:apply-templatesselect="*"mode="copy"/></xsl:copy></xsl:template><xsl:templatematch="@*|node()"mode="copy"><xsl:copy><xsl:apply-templatesselect="@*|node()"mode="copy"/></xsl:copy></xsl:template></xsl:stylesheet>
dan inilah hasilnya:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">
<Subscriptions><Userid="1"/></Subscriptions>
Oke, itu sesuai dengan yang kita harapkan, melarikan diri dilakukan agar karakter yang kita gunakan ditampilkan dengan benar. Memformat bagian XML di dalam simpul akar ditangani oleh ident="yes". Tetapi dengan melihat lebih dekat kita melihat bahwa karakter baris baru 
tidak lolos dan diterjemahkan sebagaimana adanya, melakukan double linefeed! Saya tidak punya penjelasan tentang ini, akan baik untuk diketahui. Siapa saja?
Versi kedua tidak luput dari karakter sehingga mereka menghasilkan apa yang dimaksudkan untuk mereka. Perubahan yang dilakukan adalah:
<xsl:textdisable-output-escaping="yes"><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


</xsl:text>
dan inilah hasilnya:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"><Subscriptions><Userid="1"/></Subscriptions>
dan itu akan baik-baik saja. Baik cr dan lf ditampilkan dengan benar.
Jangan lupa kita bicarakan nl, bukan crlf( nl=lf). Upaya pertama saya adalah hanya menggunakan cr: ේn sementara xml output divalidasi oleh DOM dengan benar.
Saya melihat xml rusak:
<?xml version="1.0" encoding="utf-8"?><Subscriptions>riptions SYSTEM "Subscriptions.dtd">
<Userid="1"/></Subscriptions>
Parser DOM mengabaikan karakter kontrol tetapi yang diberikan tidak. Aku menghabiskan beberapa waktu menabrak kepalaku sebelum aku menyadari betapa konyolnya aku tidak melihat ini!
Sebagai catatan, saya menggunakan variabel di dalam tubuh dengan kedua CRLF hanya untuk memastikan 100% itu akan bekerja di mana-mana.
Ini memungkinkan saya untuk menggunakan &nl;alih-alih 
menghasilkan baris baru dalam output. Seperti solusi lain, ini biasanya ditempatkan di dalam <xsl:text>tag.
Namun saya telah menggunakan tugas Ant <echoxml> untuk membuat stylesheet dan menjalankannya terhadap file. Tugas akan melakukan templat nilai atribut, misalnya $ {DSTAMP}, tetapi juga akan memformat ulang xml Anda, jadi dalam beberapa kasus, referensi entitas lebih disukai.
Jika Anda menggunakan variabel, akan lebih baik menggunakan selectbukan xsl:text. Contoh: <xsl:variable name="nl" select="'
'"/>Dengan begitu Anda tidak membuat RTF yang tidak perlu (fragmen pohon hasil).
Daniel Haley
2
Saya telah menemukan perbedaan antara baris baru <xsl:text>literal dan baris baru literal 
.
Sementara baris baru literal bekerja dengan baik di lingkungan saya (menggunakan Saxon dan prosesor Java XSLT default) kode saya gagal ketika dijalankan oleh grup lain yang berjalan di lingkungan .NET.
Mengubah ke entitas ( 
) membuat kode pembuatan file saya berjalan secara konsisten pada Java dan .NET.
Juga, baris baru literal rentan untuk diformat ulang oleh IDE dan secara tidak sengaja dapat hilang ketika file tersebut dikelola oleh seseorang 'yang tidak tahu'.
Aku sudah melihat dari pengalaman saya yang memproduksi baris baru DALAM sebuah <xsl:variable>klausul tidak bekerja. Saya mencoba melakukan sesuatu seperti:
<xsl:variablename="myVar"><xsl:choose><xsl:whentest="@myValue != ''"><xsl:text>My value: </xsl:text><xsl:value-ofselect="@myValue"/><xsl:text></xsl:text><!--NEW LINE--><xsl:text>My other value: </xsl:text><xsl:value-ofselect="@myOtherValue"/></xsl:when></xsl:choose><xsl:variable><div><xsl:value-ofselect="$myVar"/></div>
Apa pun yang saya coba masukkan ke dalam "baris baru" ( <xsl:text>simpul kosong ) tidak berfungsi (termasuk sebagian besar saran sederhana di halaman ini), belum lagi fakta bahwa HTML tidak akan berfungsi di sana, jadi akhirnya saya harus membaginya menjadi 2 variabel, memanggil mereka di luar <xsl:variable>ruang lingkup dan menempatkan sederhana di <br/>antara mereka, yaitu:
<xsl:variablename="myVar1"><xsl:choose><xsl:whentest="@myValue != ''"><xsl:text>My value: </xsl:text><xsl:value-ofselect="@myValue"/></xsl:when></xsl:choose><xsl:variable><xsl:variablename="myVar2"><xsl:choose><xsl:whentest="@myValue != ''"><xsl:text>My other value: </xsl:text><xsl:value-ofselect="@myOtherValue"/></xsl:when></xsl:choose><xsl:variable><div><xsl:value-ofselect="$myVar1"/><br/><xsl:value-ofselect="$myVar2"/></div>
Ya, saya tahu, itu bukan solusi yang paling canggih tetapi berhasil, hanya berbagi pengalaman frustrasi saya dengan XSL;)
Saya tidak bisa hanya menggunakan <xsl:text>
</xsl:text>pendekatan itu karena jika saya memformat file XML menggunakan XSLT entitas akan hilang. Jadi saya harus menggunakan sedikit lebih banyak tentang pendekatan menggunakan variabel
Jawaban:
Kode XSL berikut akan menghasilkan karakter baris baru (umpan baris):
Untuk pengembalian kereta , gunakan:
sumber
<xsl:text>
mengandung pendekatan baris baru jika Anda menggunakan apa pun yang dapat memformat ulang file XSL Anda dan mengacaukan spasi.Metode favorit saya untuk melakukan ini terlihat seperti:
Lalu, setiap kali Anda ingin menampilkan baris baru (mungkin dalam csv), Anda dapat menampilkan sesuatu seperti berikut:
Saya telah menggunakan teknik ini ketika mengeluarkan sql dari input xml. Bahkan, saya cenderung membuat variabel untuk koma, kutipan, dan baris baru.
sumber
xml:space="preserve"
kexsl:text
elemen untuk meningkatkan stabilitas, tetapi saya setuju bahwa jawaban @ Florjon mungkin lebih aman.Sertakan atribut Method = "teks" pada tag output xsl: dan sertakan baris baru dalam konten literal Anda di XSL pada titik yang sesuai. Jika Anda lebih suka menyimpan kode sumber XSL Anda rapi gunakan entitas di
mana Anda ingin baris baru.sumber
Kamu bisa memakai:
<xsl:text> </xsl:text>
lihat contohnya
jika Anda menulis ini dalam file mis
variabel ini akan menghasilkan infile baris baru sebagai:
sumber
IMHO tidak ada info lebih dari @Florjon memberi diperlukan. Mungkin beberapa detail kecil dibiarkan untuk memahami mengapa kadang-kadang itu tidak berhasil bagi kita.
Pertama-tama,


(hex) atau

(dec) di dalam a<xsl:text/>
akan selalu berfungsi, tetapi Anda mungkin tidak melihatnya.<br/>
akan baik-baik saja. Kalau tidak, Anda akan melihat ruang putih. Melihat sumber dari browser akan memberi tahu Anda apa yang sebenarnya terjadi. Namun, ada beberapa kasus yang Anda harapkan perilaku ini, terutama jika konsumen tidak secara langsung browser. Misalnya, Anda ingin membuat halaman HTML dan melihat strukturnya diformat dengan baik dengan baris dan id kosong sebelum menyajikannya ke browser.disable-output-escaping
dan di mana Anda tidak. Ambil contoh berikut ini di mana saya harus membuat xml dari yang lain dan mendeklarasikan DTD-nya dari stylesheet.Versi pertama tidak luput dari karakter (default untuk xsl: teks)
dan inilah hasilnya:
Oke, itu sesuai dengan yang kita harapkan, melarikan diri dilakukan agar karakter yang kita gunakan ditampilkan dengan benar. Memformat bagian XML di dalam simpul akar ditangani oleh
ident="yes"
. Tetapi dengan melihat lebih dekat kita melihat bahwa karakter baris baru

tidak lolos dan diterjemahkan sebagaimana adanya, melakukan double linefeed! Saya tidak punya penjelasan tentang ini, akan baik untuk diketahui. Siapa saja?Versi kedua tidak luput dari karakter sehingga mereka menghasilkan apa yang dimaksudkan untuk mereka. Perubahan yang dilakukan adalah:
dan inilah hasilnya:
dan itu akan baik-baik saja. Baik cr dan lf ditampilkan dengan benar.
nl
, bukancrlf
(nl=lf
). Upaya pertama saya adalah hanya menggunakan cr:
dan sementara xml output divalidasi oleh DOM dengan benar.Saya melihat xml rusak:
Parser DOM mengabaikan karakter kontrol tetapi yang diberikan tidak. Aku menghabiskan beberapa waktu menabrak kepalaku sebelum aku menyadari betapa konyolnya aku tidak melihat ini!
Sebagai catatan, saya menggunakan variabel di dalam tubuh dengan kedua CRLF hanya untuk memastikan 100% itu akan bekerja di mana-mana.
sumber
Saya menambahkan
DOCTYPE
arahan yang Anda lihat di sini:Ini memungkinkan saya untuk menggunakan
&nl;
alih-alih

menghasilkan baris baru dalam output. Seperti solusi lain, ini biasanya ditempatkan di dalam<xsl:text>
tag.sumber
Anda dapat mencoba,
Itu akan berhasil.
sumber
Saya kedua metode Nic Gibson, ini selalu favorit saya:
Namun saya telah menggunakan tugas Ant <echoxml> untuk membuat stylesheet dan menjalankannya terhadap file. Tugas akan melakukan templat nilai atribut, misalnya $ {DSTAMP}, tetapi juga akan memformat ulang xml Anda, jadi dalam beberapa kasus, referensi entitas lebih disukai.
sumber
select
bukanxsl:text
. Contoh:<xsl:variable name="nl" select="'
'"/>
Dengan begitu Anda tidak membuat RTF yang tidak perlu (fragmen pohon hasil).Saya telah menemukan perbedaan antara baris baru
<xsl:text>
literal dan baris baru literal

.Sementara baris baru literal bekerja dengan baik di lingkungan saya (menggunakan Saxon dan prosesor Java XSLT default) kode saya gagal ketika dijalankan oleh grup lain yang berjalan di lingkungan .NET.
Mengubah ke entitas (


) membuat kode pembuatan file saya berjalan secara konsisten pada Java dan .NET.Juga, baris baru literal rentan untuk diformat ulang oleh IDE dan secara tidak sengaja dapat hilang ketika file tersebut dikelola oleh seseorang 'yang tidak tahu'.
sumber
Aku sudah melihat dari pengalaman saya yang memproduksi baris baru DALAM sebuah
<xsl:variable>
klausul tidak bekerja. Saya mencoba melakukan sesuatu seperti:Apa pun yang saya coba masukkan ke dalam "baris baru" (
<xsl:text>
simpul kosong ) tidak berfungsi (termasuk sebagian besar saran sederhana di halaman ini), belum lagi fakta bahwa HTML tidak akan berfungsi di sana, jadi akhirnya saya harus membaginya menjadi 2 variabel, memanggil mereka di luar<xsl:variable>
ruang lingkup dan menempatkan sederhana di<br/>
antara mereka, yaitu:Ya, saya tahu, itu bukan solusi yang paling canggih tetapi berhasil, hanya berbagi pengalaman
frustrasisaya dengan XSL;)sumber
Saya tidak bisa hanya menggunakan
<xsl:text>
</xsl:text>
pendekatan itu karena jika saya memformat file XML menggunakan XSLT entitas akan hilang. Jadi saya harus menggunakan sedikit lebih banyak tentang pendekatan menggunakan variabelsumber
tambahkan saja tag ini:
ini bekerja untuk saya;).
sumber