Używanie encji HTML w XSLT (np.  )

Jaki jest najlepszy sposób na włączenie encji html w XSLT?

<xsl:template match="/a/node">
    <xsl:value-of select="."/>
    <xsl:text>&nbsp;</xsl:text>
</xsl:template>

Ten zwraca XsltParseError

 59
Author: bluish, 2008-08-28

11 answers

Możesz użyć sekcji CDATA

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

Lub możesz opisać & nbsp w lokalnym DTD:

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

Lub po prostu użyj &#160; zamiast &nbsp;

 112
Author: aku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-28 09:08:01

Możliwe jest również rozszerzenie podejścia z drugiej części odpowiedzi aku i udostępnienie wszystkich znanych odniesień do znaków, takich jak:

<!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>&nbsp;&minus;30&deg;</xsl:text>

Istnieje pewna różnica w wyniku w porównaniu z podejściem <xsl:text disable-output-escaping="yes">. Ta ostatnia będzie wytwarzać literały łańcuchowe, takie jak &nbsp; dla wszystkich rodzajów danych wyjściowych, nawet dla <xsl:output method="text">, a to może się różnić od tego, czego byś sobie życzył... Wręcz przeciwnie, uzyskanie encji zdefiniowanych dla szablonu XSLT za pomocą <!DOCTYPE ... <!ENTITY ... zawsze spowoduje wyjście zgodne z ustawieniami xsl:output.

Może być rozsądne użycie lokalnego mechanizmu rozpoznawania encji, aby silnik XSLT nie pobierał definicji encji znaków z Internetu. Użytkownicy JAXP lub jawni Xalan-J mogą potrzebować łatki dla Xalan-J, aby poprawnie używać resolvera. Zobacz mój blog XSLT, entities, Java, Xalan... do pobierania patcha i komentarzy.

 22
Author: s-n-ushakov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:00:34

Inna możliwość użycia encji html z xslt jest następująca:

<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
 14
Author: Pierre Spring,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-28 09:10:04

XSLT domyślnie obsługuje tylko pięć podstawowych elementów: lt, gt, apos, quot, i amp. Wszystkie inne muszą być zdefiniowane jako @Aku .

 6
Author: samjudson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:31

Ten zwraca XsltParseError

Tak, a powodem tego jest to, że &nbsp; nie jest predefiniowanym elementem w XML lub XSLT, jak jest w HTML.

Możesz po prostu użyć znaku unicode, który {[0] } oznacza: &#160;

 5
Author: Tom Lokhorst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-28 09:04:39

Teraz, gdy istnieje Unicode, używanie nazwanych encji znaków jest na ogół nieproduktywne. Zalecałbym użycie znaku Unicode dla niełamliwych spacji zamiast encji, właśnie z tego powodu. Alternatywnie możesz użyć encji &#160;, zamiast encji nazwanej. Używanie nazwanych jednostek sprawia, że XML jest zależny od wbudowanego lub zewnętrznego DTD.

 5
Author: James Sulak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-28 12:59:00

Znalazłem wszystkie te rozwiązania wytwarzają znak  w pustej przestrzeni.

Użycie <xsl:text> </xsl:text> rozwiązało problem dla mnie; ale <xsl:text>#x20;</xsl:text> może również zadziałać.

 1
Author: SixOThree,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-24 20:03:28

Dziękuję za informacje. Napisałem krótki wpis na blogu oparty na tym, co działało dla mnie, gdy robiłem transformację XSLT w szablonie Dynamicweb CMS.

Wpis na blogu jest tutaj: Jak dodawać encje do szablonów XSLT .

/Sten Hougaard

 0
Author: Netsi1964,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-18 13:05:24

Konieczne jest użycie encji #x160;

 0
Author: Евгений Раткевич,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-25 08:44:31

Nie miałem szczęścia z podejściem DOCTYPE od Aku.

To, co działało dla mnie w MSXML transforms na serwerze Windows 2003, to

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

Rodzaj hybrydy z powyższych. Dziękujemy współpracownikom Stackoverflow!

 0
Author: Dave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-27 01:41:34

Jeden znak spacji między znacznikami tekstowymi powinien wystarczyć.

 -3
Author: Ayça Deniz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-02 21:27:32