Я ломал голову, пытаясь понять, почему следующий вызов XSLTProcessor не работает.
XSL-Т
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" xml:space = "default">
<xsl:output method = "text" version = "1.0" encoding = "UTF-8" indent = "no"/>
<xsl:strip-space elements = "*"/>
<xsl:param name = "include-header" select = "'false'"/>
<xsl:template match = "/">
<!--xsl:element name = "row"-->
<xsl:text>{</xsl:text>
<xsl:apply-templates select = "*"/>
<!--/xsl:element-->
<xsl:text>}</xsl:text>
</xsl:template>
<xsl:template match = "*[count(descendant::*)=0]">
<xsl:param name = "parent"/>
<xsl:variable name = "quote" select = "'"'"/>
<xsl:variable name = "thisName" select = "name()"/>
<xsl:variable name = "precedingSibling" select = "count(preceding-sibling::*[name()=$thisName])+1"/>
<xsl:variable name = "parentChild" select = "concat($parent, '.',$thisName, $precedingSibling)"/>
<xsl:value-of select = "concat($quote,$parentChild, $quote, ': ', $quote, ., $quote, ',')"/>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match = "*">
<xsl:call-template name = "recurse-descendents"/>
</xsl:template>
<xsl:template match = "*[count(descendant::*)>0]">
<xsl:call-template name = "recurse-descendents"/>
</xsl:template>
<xsl:template name = "recurse-descendents">
<xsl:variable name = "thisName" select = "name()"/>
<xsl:apply-templates select = "*[count(descendant::*)=0]">
<xsl:with-param name = "parent" select = "concat($thisName, count(preceding-sibling::*[name()=$thisName])+1)"/>
</xsl:apply-templates>
<xsl:apply-templates select = "*[count(descendant::*)>0]"/>
</xsl:template>
</xsl:stylesheet>
Пример XML
<?xml version = "1.0" encoding = "UTF-8"?>
<foods>
<meats>
<meat>Beef</meat>
<meat>Chicken</meat>
<meat>Lamb</meat>
</meats>
<fruits>
<fruit>Orange</fruit>
<fruit>Apple</fruit>
<fruit>Banana</fruit>
<fruit>Avacado</fruit>
</fruits>
<vegetables>
<vegetable>Carrot</vegetable>
<vegetable>Cellery</vegetable>
<vegetable>Potato</vegetable>
</vegetables>
</foods>
Вывод из XML Spy (как и ожидалось)
{"meats1.meat1": "Beef",
"meats1.meat2": "Chicken",
"meats1.meat3": "Lamb",
"fruits1.fruit1": "Orange",
"fruits1.fruit2": "Apple",
"fruits1.fruit3": "Banana",
"fruits1.fruit4": "Avacado",
"vegetables1.vegetable1": "Carrot",
"vegetables1.vegetable2": "Cellery",
"vegetables1.vegetable3": "Potato",
}
Код Javascript с использованием XSLTProcessor (не работает)
async function GenerateTestCaseResponse(xml, testCase) {
const domParser = new DOMParser();
const xsltProcessor = new XSLTProcessor();
const xslResponse = await fetch("transformer/generate-response-json.xslt");
const xslText = await xslResponse.text();
const xslStylesheet = domParser.parseFromString(xslText, "application/xml");
xsltProcessor.importStylesheet(xslStylesheet);
var responseDomParser = new DOMParser();
var responseDocument = responseDomParser.parseFromString(xml, "text/xml");
var result = xsltProcessor.transformToDocument(responseDocument);
console.info(result.body);
return result;
}
Вызов xsltProcessor.transformToDocument возвращает пустой результат без ошибок или исключений. Не знаю, как решить, и любые мысли принимаются с благодарностью.
нет, отлаженный вызов браузера правильный + переданный xml действителен. Также подтверждено, что XSLT загружен.
с чего ты взял, что будет .body? то, что вы ищете, находится в result.firstElementChild.textContent



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Как уже указывалось в комментарии, в произвольных XML-документах нет тела. Кажется, вы все равно хотите использовать текст метода вывода и текстовое содержимое, поэтому используйте результат фрагмента и получите доступ к его свойству textContent, например.
const xsltSource = `<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" xml:space = "default">
<xsl:output method = "text" version = "1.0" encoding = "UTF-8" indent = "no"/>
<xsl:strip-space elements = "*"/>
<xsl:param name = "include-header" select = "'false'"/>
<xsl:template match = "/">
<!--xsl:element name = "row"-->
<xsl:text>{</xsl:text>
<xsl:apply-templates select = "*"/>
<!--/xsl:element-->
<xsl:text>}</xsl:text>
</xsl:template>
<xsl:template match = "*[count(descendant::*)=0]">
<xsl:param name = "parent"/>
<xsl:variable name = "quote" select = "'"'"/>
<xsl:variable name = "thisName" select = "name()"/>
<xsl:variable name = "precedingSibling" select = "count(preceding-sibling::*[name()=$thisName])+1"/>
<xsl:variable name = "parentChild" select = "concat($parent, '.',$thisName, $precedingSibling)"/>
<xsl:value-of select = "concat($quote,$parentChild, $quote, ': ', $quote, ., $quote, ',')"/>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match = "*">
<xsl:call-template name = "recurse-descendents"/>
</xsl:template>
<xsl:template match = "*[count(descendant::*)>0]">
<xsl:call-template name = "recurse-descendents"/>
</xsl:template>
<xsl:template name = "recurse-descendents">
<xsl:variable name = "thisName" select = "name()"/>
<xsl:apply-templates select = "*[count(descendant::*)=0]">
<xsl:with-param name = "parent" select = "concat($thisName, count(preceding-sibling::*[name()=$thisName])+1)"/>
</xsl:apply-templates>
<xsl:apply-templates select = "*[count(descendant::*)>0]"/>
</xsl:template>
</xsl:stylesheet>`;
const xmlSource = `<?xml version = "1.0" encoding = "UTF-8"?>
<foods>
<meats>
<meat>Beef</meat>
<meat>Chicken</meat>
<meat>Lamb</meat>
</meats>
<fruits>
<fruit>Orange</fruit>
<fruit>Apple</fruit>
<fruit>Banana</fruit>
<fruit>Avacado</fruit>
</fruits>
<vegetables>
<vegetable>Carrot</vegetable>
<vegetable>Cellery</vegetable>
<vegetable>Potato</vegetable>
</vegetables>
</foods>`;
function GenerateTestCaseResponse(xmlSource, xsltSource) {
const domParser = new DOMParser();
const xsltProcessor = new XSLTProcessor();
const xsltStylesheet = domParser.parseFromString(xsltSource, "application/xml");
xsltProcessor.importStylesheet(xsltStylesheet);
var xmlDoc = domParser.parseFromString(xmlSource, "application/xml");
var result = xsltProcessor.transformToFragment(xmlDoc, xmlDoc).textContent;
console.info(result);
return result;
}
GenerateTestCaseResponse(xmlSource, xsltSource);
Возможно, вы неправильно вызываете свою функцию
GenerateTestCaseResponse?