Nasıl eklenir & nbsp; XSLT içinde


207

Nasıl ekleyebilirim

 

Bir XSLT stil sayfasına, bu hatayı almaya devam ediyorum:

XML Ayrıştırma Hatası: tanımlanmamış varlık

Aslında XSLT Şablonu'nda boşluk karakteri istemiyorum.


2
Ayrıca & # xA0; aynı & # 160; buraya bak stackoverflow.com/questions/7511214/…
user3766111

Yanıtlar:


337

 Bunun yerine varlık kodunu kullanın.

 HTML "karakter varlığı referansı" dır. XML'de kesilmeyen alan için adlandırılmış varlık yoktur, bu nedenle kodu kullanırsınız  .

Vikipedi XML ve HTML varlıkların listesini içerir ve XML sadece 5 "önceden tanımlanmış varlıklar" olduğunu görebilirsiniz, ancak HTML 200'ün üzerinde vardır ben de yanına işaret edeceğiz bir boşluk oluşturma (& nbsp;) XSL sahiptir mükemmel cevaplar.


3
Son zamanlarda birçok XSL'den sadece birinde bu teknikle çalışmayı bıraktığı ve garip bir karakter göstermeye başladığı bir durumla karşılaştık. Ancak, WaterSoul'un CDATA tekniğini kullanırsam çalışır.

@BrianReindel, bu muhtemelen yanlış bir sayısal varlık referansı kullandığınız anlamına gelir, yani Šbunun yerine  her zaman bir Unicode kırılmayan alana çözümlenecektir.
Abel

İlk On Java ve XSLT İpuçları bağlantısı gerçekten yararlıdır.
LCJ

<xsl: text> & / # 160; </ xsl: text> iki alanı
ayırır

1
Bağlantı çürümüş.
GSerg

37

&#160;gerçekten iyi çalışıyor. Ancak, ANSI kodlamasında bu garip karakterlerden birini görüntüler. <xsl:text>benim için en iyi çalıştı.

<xsl:text> </xsl:text>

3
Kabul edilen cevabı kullanarak XML çıktımda bir satır kesme alanı buldum (en azından VS2010'un XML düzenleyicisinde böyle görünüyordu). Bu cevabı kullanarak sadece tam olarak 1 yer kazanıyorum.
Mathijs Flietstra

1
@Matthijs, bu bir boşluk, kırılmayan bir alan değil, aynı değil. VS yanlış gösteriyorsa, kodunuzu kontrol edin (VS bunu doğru bir şekilde gösterme yeteneğine sahiptir ve bağımsız kodlama yapmalıdır, bu yüzden yanlış bir şey yapıyorsunuz).
Abel

25

Bunu da yapabilirsiniz:

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

2
Bu çalışacaktır eğer işlemci destekleridisable-output-escaping bunun için gerekli değildir ve XSLT 2.0 kullanımdan kaldırılmış ve daha çok 3.0 'oldu. Bu sürümlerde, xsl:character-mapçapraz işlemcinin çalışması garantili olarak aynı etkiye ulaşabilirsiniz . Ayrıca, bu &nbsp;, çıktıya kesinti olmayan bir alanla aynı olması gerekmeyen adlandırılmış bir varlık yerleştirir ve alıcı uç bu varlığı bildirmiş olmalıdır (HTML'de genellikle örtüktür).
Abel

21

Bunu kullan

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

edit: Downvoters muhtemelen bu ilk çalıştığını doğrulamak gerekir (yapar ve sorunun en genel çözümdür.)


1
Emin değilim, ama yaklaşımımı test ettim ve işe yarıyor, bu yüzden downvote'un ne için olduğundan emin değilim :(
jagprinderdeep

2
Ayrıca, kabul edilen cevap bağlantılı sayfaya göre tüm ayrıştırıcılar için geçerli olmayacaktır; just a heads up
jagprinderdeep

1
Daha önce düşüşümün sebebini vermiştim, ancak bu cevabı küçümseyeceksem , neden olurdu - yanlış soruyu cevaplar. OP açıkça xslt kullanarak kırılmaz alana nasıl koyulacağını sordu ve ampersand-nbsp-noktalı virgül dizisini nasıl koyacağınızı yanıtladı. Ve downvotes üzerinde kavga da gereksizdir. Ama cidden, CDATA hakkında bunu hiç söylemedin mi?
Michael Krelin - hacker

1
Tamam, jagprinderdeep, downvote'umu iptal ediyorum, ama bunun karşılığında lütfen akıl hastanesine girdikten sonra beni ziyaret et. (bu yeni nedenden dolayı size geri oy vermediğimi unutmayın). Ancak yanlış soruya cevap verdiğinizi anlayın. Bence bu diğer düşüşün ardında yatan sebep buydu.
Michael Krelin - hacker

8
Ayrıca, alıcı sonun & nbsp; beyan edeceğini garanti edemediğiniz için aşağı indirdim. Eğer xslt + html ile çalışıyorsanız, evet, bu bir hack de olsa bunu yapmanın bir yoludur. Ancak, diğer xml oluşturmak için xslt kullanıyorsanız, o zaman sadece size patlar.
Doug

14

Dosyanın başına bu varlık için tanım eklemek isteyebilirsiniz (xml bildiriminin altında):

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

Ayrıca Ntilde, Aacute vb. Gibi daha fazla varlık ekleyebilirsiniz.


5

Victor hugo'nun cevabına ek olarak , bilinen tüm karakter referanslarını bir XSLT dosyasında yasal olarak elde etmek mümkündür, örneğin:

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

Bu yaklaşımın sonucunda, <xsl:text disable-output-escaping="yes">bire kıyasla belirli bir fark vardır . İkincisi, &nbsp;her türlü çıktı için olduğu gibi , dizgi değişmezleri de üretecek <xsl:output method="text">ve bu istediğinizden farklı olabilir ... Aksine, XSLT şablonu için tanımlanan varlıkların elde <!DOCTYPE ... <!ENTITY ...edilmesi her zaman senin xsl:outputayarları.

Ve tüm karakter referanslarını dahil ederken, XSLT motorunun Internet'ten karakter varlığı tanımlarını almasını önlemek için bir yerel varlık çözümleyici kullanmak akıllıca olabilir. JAXP veya açık Xalan-J kullanıcıları, çözümleyiciyi doğru kullanmak için Xalan-J için bir yamaya ihtiyaç duyabilir. Yama indirme ve yorumlar için XSLT, varlıklar, Java, Xalan ... bloguma bakın .


1
Son zamanlarda, W3'ün otomatik bir işlemden gelmesi durumunda bu ve benzeri bağlantılara çok fazla istek engellemeye başladığını unutmayın. Bu dosyayı yerel olarak veya sunucunuza yerleştirin ve URL'yi buna göre ayarlayın. Bunun dışında +1 ve HTML adlı varlıkları kullanmak için mükemmel bir çözüm.
Abel

İyi bir not ve dosyanın tanımları ile dosyanın yerel bir kopyasına sahip olmanın başka bir nedeni de var, aksi takdirde internet bağlantısı yoksa XSLT işleminin başarısız olması muhtemeldir. Java dünyasında URL'leri hacklemeye gerek yoktur, çünkü EntityResolver için düzenleme yapmak mümkündür ve Apache XML Commons Resolver iyi bir aday olabilir. Diğer programlama platformları da benzer tekniklere sahip ...
Sergey Ushakov


2

Aşağıdakileri (olmadan disable-output-escaping!) Kullandığınızda tek bir kırılmaz alan elde edersiniz:

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


4
Buna gerek yok disable-output-escapingbunun için
Ian Roberts

2

XSLT stil sayfaları iyi biçimlendirilmiş XML olmalıdır. Yana "&nbsp;"biri değil beş önceden tanımlanmış XML varlıklarına , doğrudan stil dahil edilemez. Çözümünüze geri dönmeniz , kullanmanız gereken "&#160;"mükemmel bir yedek "&nbsp;".

Misal:

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

0

Ayrıca kullanabilirsiniz:

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

amp'den sonra amp'i hatırlayın yoksa bir hata mesajı alırsınız


Bu, `` (nb-space) olarak değil &amp;nbsp;, görüntülenecek olan (orada olması için noktalı virgül olmasını istediğinizi varsayarsak) çıkacaktır &nbsp;.
Abel

0

HTML tablosundaki boş bir hücrede kenarlıkları göstermeye çalışıyordum. Boş hücrelerde kırılmaz boşluk kullanmanın eski hilesi xslt'den çalışmıyordu. Aynı etki ile satır sonu kullandım. Kesin olmayan alanı kullanmaya çalışmanızın nedeninin, hücre sınırlarını açmak için 'boş' bir tablo hücresine bazı içerik vermek olması durumunda bundan bahsediyorum.

<br/>

Benzer bir senaryo var ve bu tablo hücreleri render almak için çalışıyor gibi görünüyor.
Richard Moore

0

Kullanmaya çalışmak

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

Ancak kullandığınız XSLT işlemciye bağlıdır: XSLT özelliği XSLT işlemcilerin bunu " &nbsp;" biçimine dönüştürmesini gerektirmez .


0

Her ne kadar cevap @brabster ve diğerleri tarafından zaten sağlanmış olsa da.
Bence daha çok yeniden kullanılabilir çözüm:

<xsl:variable name="space">&#160;</xsl:variable>
...
<xsl:value-of select="$space"/>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.