У меня есть файл xml с нестандартными символами, и я хотел бы преобразовать их в кодировку Windows 1252, например, &#nnn Я плохо понимаю XSLT, но я пробовал это, помогите, пожалуйста, вот XML и XSLT
<?xml version = "1.0"?>
<xsl:transform xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output method = "xml" omit-xml-declaration = "yes" indent = "yes" encoding = "Windows-1252"/>
<xsl:template match = "/Recordset">
<Recordset><xsl:apply-templates /></Recordset>
</xsl:template>
<xsl:template match = "*|@*">
<xsl:copy>
<xsl:apply-templates select = "@*" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
</xsl:transform>
Пример XML для символов
<?xml version = "1.0"?>
<Recordset>
128 € euro sign
129 NOT USED
130 ‚ single low-9 quotation mark
131 ƒ Latin small letter f with hook
132 „ double low-9 quotation mark
133 … horizontal ellipsis
134 † dagger
135 ‡ double dagger
136 ˆ modifier letter circumflex accent
137 ‰ per mille sign
138 Š Latin capital letter S with caron
139 ‹ single left-pointing angle quotation mark
140 Œ Latin capital ligature OE
141 NOT USED
142 Ž Latin capital letter Z with caron
143 NOT USED
144 NOT USED
145 ‘ left single quotation mark
146 ’ right single quotation mark
147 “ left double quotation mark
148 ” right double quotation mark
149 • bullet
150 – en dash
151 — em dash
152 ˜ small tilde
153 ™ trade mark sign
154 š Latin small letter s with caron
155 › single right-pointing angle quotation mark
156 œ Latin small ligature oe
157 NOT USED
158 ž Latin small letter z with caron
159 Ÿ Latin capital letter Y with diaeresis
160 no-break space
</Recordset>
@MartinHonnen utf-8 - это ввод XML
Обозначение { в XML всегда представляет символ, кодовая точка Unicode которого равна 123, и никогда не представляет символ, кодировка которого равна 123 в чем-то вроде кодовой страницы Windows-1252. Это верно независимо от кодировки файла XML.
@MichaelKay, приведенное выше, представляет собой xml для наборов символов окна 1252, если это должно быть правильно преобразовано, символы будут представлены &#nnn
, что является кодировкой Windows, все, что я пытаюсь сделать, это иметь xslt, подобный приведенному выше, который может распознать это и добавить правильное представление. Обозначение nnn будет состоять из чисел в начале, например, маркера •
@ Тим, нет, ты пропустил мою мысль. В XML •
представляет собой управляющий символ «ожидание сообщения» (и разрешен только в XML 1.1), независимо от кодировки файла. Пункт пули — •
, опять же, независимо от кодировки файла.
Символы, о которых вы спрашиваете, могут быть представлены в кодировке символов документа, о которой вы спрашиваете. Таким образом, вам не нужно использовать числовые ссылки на символы.
XSLT кажется излишним для изменения кодировки символов документа. Вам нужно прочитать исходный файл XML и записать его снова, используя другую кодировку символов документа. Это приведет к тому, что кодовые точки Unicode, которые не могут быть представлены в выбранной вами кодировке символов, будут сериализованы как ссылки на числовые символы. Нет необходимости в XSLT, и вам нужно будет все это для XSLT. Таким образом, вы можете пропустить шаг XSLT.
Тем не менее, если у вас есть инструмент, который читает файл XML, применяет преобразование и снова записывает его, соблюдая атрибут кодирования xsl:output, вы можете использовать Преобразование личности с соответствующим элементом вывода:
<xsl:stylesheet version = "2.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "XML" encoding = "Windows-1252" />
<xsl:template match = "@*|node()">
<xsl:copy>
<xsl:apply-templates select = "@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Если вы сделаете это в своем образце документа, вы увидите, что «знак евро 128 евро» действительно закодирован в Windows-1252.
31 32 38 20 80 20 65 75 72 6F 20 73 69 67
Если вы хотите, чтобы символ € был представлен в виде ссылки на объект с числовым символом, используйте кодировку документа для набора символов, который ее не поддерживает, например, IBM437.
Однако неясно, почему вам нужна кодировка символов документа, отличная от UTF-8. XML-процессор не сможет далеко продвинуться, если он не поддерживает набор символов для XML, то есть Unicode.
XML поддерживает стандарт Unicode, поэтому любой символ Unicode является стандартным символом в XML. Независимо от того, используете ли вы XML с XSLT или каким-либо иным образом, синтаксический анализ входного XML-документа, как вы показали, не представляет проблемы, если XML-документ правильно объявляет свою кодировку в объявлении XML в начале. Однако ваш пример с
<?xml version = "1.0"?>
этого не делает. Так что напрашивается вопрос? Какова кодировка входного XML-документа?