Вы можете сделать это с помощью JavaScript (Windows Script Host запустит его):
function xmlTransformAndSave(xml, xsl, saveXmlPath, saveEnableOverwrite) {
// Transforms input XML and saves output to file, preserving encoding specified
// by xsl:output encoding attribute. The method used resolves the issue of XSL
// XML output forced to UTF-16 encoding the moment it becomes a string in
// JavaScript (JavaScript strings are UTF-16). Note saveEnableOverwrite is an
// optional parameter enabled by default.
// Optional input parameter default value
saveMode = typeof saveMode != 'undefined' ? saveMode : true;
// Convert to stream saveToFile parameter (1 = create; 2 = overwrite)
saveMode = saveMode = true ? 2 : 1;
// Output object, a stream (to preserve output encoding set in XSL)
var stream = WScript.createObject("ADODB.Stream");
stream.open();
stream.type = 1;
// Transform and save to file
xml.transformNodeToObject(xsl, stream);
stream.saveToFile(saveXmlPath, saveMode);
stream.close();
}
Параметры xml и xsl - это объекты DOMDocument с уже загруженными xml и xsl. Например, xsl может прийти из этой функции:
function getXsl(xslPath) {
//Returns XSL loaded from xslPath supplied
//Create DOM "xsl" for XSL, set DOM options, and load XSL file
var xsl = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.3.0");
xsl.async = false;
xsl.resolveExternals = false;
xsl.validateOnParse = false;
xsl.load(xslPath);
//Return xsl
return xsl;
}
Используя этот метод преобразования, вы можете установить входные параметры XSL с помощью следующего кода:
function xslSetParam(xsl, paramName, paramValue) {
// Sets parameter value in xsl (call before transform)
// Requires XSL structure "xsl:stylesheet" (NOT "xsl:transform", and NOT "xslt:")
// Select parameter to set
var xslParam = xsl.selectSingleNode("/xsl:stylesheet/xsl:param[@name='" + paramName + "']");
// Set parameter value
xslParam.setAttribute("select", paramValue);
}
Выходная кодировка, указанная в XSL, теперь будет выходной кодировкой файла и указана в объявлении XML файла, как и ожидалось. Таким образом, выходная кодировка в вашем XSL выглядит так:
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
Даст вам желаемый результат - вот так:
<?xml version="1.0" encoding="UTF-8"?>