Я преобразовываю файл 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
заранее спасибо
да точно, это тот же вывод. Я хотел бы сохранить «é», если это возможно, а не «é». Потому что я использую «é» в пути к файлу. Благодарю вас!
Вы можете использовать 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
Я попробовал ваш пример, я вижу закодированный акцент
é
->é
У вас такой же вывод?