Сохранить XML после преобразования XSL с помощью PHP

Я преобразовываю файл XML в другой файл XML, используя файл XSL на странице PHP. Для этого я использую DOMDocument, передавая XML-файл и XSL-файл в качестве параметров.

Преобразование работает, но символы UTF-8 заменяются в выходном XML-файле. Однако мой исходный XML-файл находится в UTF-8, как и мой лист XSL.

Функция simplexml_load_string кодирует диакритические знаки в UTF-8. Но при сохранении файла с помощью функции saveXML созданный файл не содержит акцентов. Я не понимаю, почему UTF-8 не работает. У вас есть идея?

Вот пример входного XML-файла:

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<Transfer xmlns = "dase:v2.1" xmlns:ns2 = "http://www.w3.org/1999/xlink" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xml:id = "_20220325095723763" xsi:schemaLocation = "dase:v2.1 main.xsd">
    <Message>test</Message>
    <CodeList>
        <Element>villé</Element>
    </CodeList>
</Transfer>

Вот мой XSL-файл:

<?xml version = "1.0" encoding = "UTF-8" ?>
<xsl:stylesheet version = "1.1" xmlns:dase = "dase:v2.1"
    xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" xmlns:ns2 = "http://www.w3.org/1999/xlink"
    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
    xmlns = "dase:v2.1" exclude-result-prefixes = "dase">

    <xsl:strip-space elements = "*"/>
    <xsl:output indent = "yes" method = "xml" encoding = "UTF-8" omit-xml-declaration = "yes"/>

    <xsl:template match = "@* | node()">
        <xsl:copy>
            <xsl:apply-templates select = "@* | node()"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match = "dase:Message">
        <xsl:comment>
            <xsl:text>New value</xsl:text>
        </xsl:comment>
    </xsl:template>

</xsl:stylesheet>

Вот мой PHP-код:

$xmlDoc = new DOMDocument('1.0', 'UTF-8');
$xmlDoc->formatOutput = true;
$xmlDoc->encoding = 'UTF-8';
$xmlDoc->load("./uploads/" . $fileName);
$xmlDoc->encoding = 'UTF-8';
$xslDoc = new DomDocument('1.0');

$xslDoc->load("./xslt/file.xsl");
$proc = new XSLTProcessor;

$proc->importStyleSheet($xslDoc);
$strXml = $proc->transformToXML($xmlDoc);

//echo ($proc->transformToXML($xmlDoc)); //here, the accent is fine

$convertedXML = simplexml_load_string($strXml);
$convertedXML->encoding = 'UTF-8';
//print_r($convertedXML); //here, the accent is fine

$convertedXML->encoding = 'UTF-8';
$convertedXML->saveXML("./uploads/Cleaned_" . $fileName); //the save file have accent problem

заранее спасибо

Я попробовал ваш пример, я вижу закодированный акцент é -> &#xE9; У вас такой же вывод?

Joffrey Schmitz 05.05.2022 17:41

да точно, это тот же вывод. Я хотел бы сохранить «é», если это возможно, а не «&#xE9;». Потому что я использую «é» в пути к файлу. Благодарю вас!

Pick 05.05.2022 20:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать html_entity_decode() для декодирования объектов HTML и возврата символов с диакритическими знаками:

$outputFilename = "./Cleaned_" . $fileName ;
$output = $convertedXML->saveXML(); // get the XML file content 
$output = html_entity_decode($output, ENT_NOQUOTES, 'UTF-8'); // decode HTML characters
file_put_contents($outputFilename, $output); // write decoded content to disk

Другие вопросы по теме

Похожие вопросы

Как данные API YouTube для печати в метабоксе набора инструментов с помощью нажатия кнопки перед сохранением-публикацией
Шорткод WordPress отображает заголовок страницы и исключает определенные слова из заголовка
Регулярное выражение, чтобы не начинать с определенного слова
Добавление в массив, если значение не существует
Symfony6: установка/обновление/управление переменными окружения (APP_ENV) с помощью PHP (bootstrap.php)
Используйте ключи подмассива для формирования новых ключей первого уровня для группировки значений
Как я могу увеличивать и уменьшать значение с уникальным идентификатором?
Как выбрать уникальные значения из нескольких столбцов (каждое значение уникально, а не вся строка)
Проверка изображения Laravel просто перезагружает страницу и ничего не делает
Получение ошибки Неопределенный ключ массива в сценарии входа в php