/ / Usuń znaki spoza określonego kodowania XSLT - xml, xslt, kodowanie, kodowanie znaków

Usuń znaki nie w określonym kodowaniu XSLT - xml, xslt, kodowanie, kodowanie znaków

Próbuję przekształcić utf-8 xml plik źródłowy do iso-8859-1 xml plik docelowy. Chciałbym XSLT aby usunąć wszystkie niepoprawne znaki iso-8859-1. Czy to możliwe ?

Idealnym sposobem byłoby otrzymanie docelowego kodowania jako parametru, usunięcie wszystkich nieprawidłowych znaków dotyczących tego kodowania i użycie parametru do ustawienia atrybutu kodowania w xsl:output tag.

Wykonałem testy na pliku, który zawiera chińskie znaki, mój XSLT zawiera

<xsl:output method="xml" encoding="iso-8859-1" indent="yes" />

ale chińskie znaki są przekształcane w rzeczy takie jak & # 20320 ;

Z góry dziękuję.

Odpowiedzi:

1 dla odpowiedzi № 1

Zakładając, że XSLT 1.0:
Jest to możliwe, ale raczej nudne. Musisz wymienić wszystkie znaki w zestawie, a następnie użyć funkcji translate () (dwukrotnie) na każdym węźle tekstowym, który wysyłasz do drzewa wyników. Na przykład: ten arkusz stylów:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:param name="charset" select=""1234567890"" />

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="text()">
<xsl:value-of select="translate(., translate(., $charset, ""), "")"/>
</xsl:template>

</xsl:stylesheet>

po zastosowaniu do następujących danych wejściowych:

<input>
<para>John has 3 apples.</para>
<para>Eve has 2 oranges.</para>
</input>

spowoduje:

<?xml version="1.0" encoding="utf-8"?>
<input>
<para>3</para>
<para>2</para>
</input>

1 dla odpowiedzi nr 2

Kodowanie wyjściowe XSL określa kodowanie pliku wyjściowego jest w.

Gwarantuje, że żaden znak zapisany w pliku / strumieniu wyjściowym nie jest poza zdefiniowanym zakresem znaków, w tym przypadku iso-8859-1. I sznurek "&#20320;" znajduje się w tym zakresie, mimo że znak, który reprezentuje (U + 4F60, 你) nie jest „t.

The <output charset="..."> dyrektywa przełącza kodowanie bajtów (np. "你" jest 0xE4 0xBD 0xA0 w utf-8 i 0x60 0x4F w UTF-16), ale jeśli to nie jest możliwe, nie powoduje to zatarcia tekstu, tj. nie zastąpi chińskich znaków w danych wejściowych znakami zapytania (lub co gorsza, nic) w danych wyjściowych.

Stara się zachować postać za pomocądobrze zdefiniowany schemat kodowania: numerowana jednostka znaku. Agent użytkownika, który wyświetla dane, może je wyświetlić jako znak zapytania lub, jeśli ma taką możliwość, jako oryginalny znak.

Następujący XML:

<?xml version="1.0" encoding="iso-8859-1"?>
<test>&#20320;</test>

i

<?xml version="1.0" encoding="utf-8"?>
<test>你</test>

oba wyświetlają się jako

<test>你</test>

w mojej przeglądarce to, co robi twój procesor XSLT, jest właściwie Pomyśl, jeśli ty naprawdę chcesz stracić te postacie.


1 dla odpowiedzi nr 3

Dla iso-8859-1 możesz to zrobić

replace($x, "[^&#x1;-&#xff;]", "")

Ale to nie generalizuje do innych kodowań.

Jeśli używasz Saxona, sugerowałbymdostosowywanie serializatora (możesz ustawić własny SerializerFactory, który może utworzyć potok zawierający swój własny XMLEmitter, który może podklasować standardowego XMLEmittera, aby pominąć znaki, które nie znajdują się w wybranym kodowaniu, zamiast ich uciekać).

Alternatywnie postprocesuj dane wyjściowe (np. Za pomocą Perla lub Awka), aby usunąć wszystkie numeryczne odwołania do znaków.

Co więcej, kwestionowałbym ten wymóg. To, co chcesz zrobić, nie wydaje się dobre.