使用 PHP 进行 XSL 转换后保存 XML

Save XML after XSL transformation using PHP

我在 PHP 页面中使用 XSL 文件将一个 XML 文件转换为另一个 XML 文件。 为此,我通过将 XML 文件和 XSL 文件作为参数传递来使用 DOMDocument。

转换有效,但 UTF-8 字符在输出 XML 文件中被替换。但是,我的原始 XML 文件是 UTF-8 格式,我的 XSL sheet.

也是如此

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