Добавить шаблон
<xsl:template match="string[@key = 'subjects']" xpath-default-namespace="http://www.w3.org/2005/xpath-functions">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:sequence select="parse-xml(.)/node()"/>
</xsl:copy>
</xsl:template>
чтобы убедиться, что строковые данные анализируются в XML.
Обратите внимание, что при использовании XSLT 3.0 вы можете использовать <xsl:mode on-no-match="shallow-copy"/>
вместо того, чтобы указывать преобразование идентификатора.
Быстрый пример
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="jsonText"><![CDATA[{
"student" : "john",
"class" : "Bachelors",
"subjects" : "<college><subject><subjects>maths</subjects><term>spring</term></subject></college>"
}]]></xsl:param>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template name="init">
<xsl:apply-templates select="json-to-xml($jsonText)"/>
</xsl:template>
<xsl:template match="string[@key = 'subjects']" xpath-default-namespace="http://www.w3.org/2005/xpath-functions">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:sequence select="parse-xml(.)/node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
который (при запуске с Saxon 9.8.0.3 HE с it:init
) выводит
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<string key="student">john</string>
<string key="class">Bachelors</string>
<string key="subjects">
<college xmlns="">
<subject>
<subjects>maths</subjects>
<term>spring</term>
</subject>
</college>
</string>
</map>
Вот полная программа Java, основанная на ваших фрагментах кода, опубликованных в различных редакциях:
import java.io.File;
import java.io.OutputStream;
import javax.xml.transform.stream.StreamSource;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.QName;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.Serializer;
import net.sf.saxon.s9api.XdmAtomicValue;
import net.sf.saxon.s9api.XsltCompiler;
import net.sf.saxon.s9api.XsltExecutable;
import net.sf.saxon.s9api.XsltTransformer;
public class Saxon98HETest1 {
public static void main(String[] args) throws SaxonApiException {
final String XSLT_PATH = "sheet1.xsl";
String JSON = "{\n" +
" \"student\" : \"john\",\n" +
" \"class\" : \"Bachelors\",\n" +
" \"subjects\" : \"<college><subject><subjects>maths</subjects><term>spring</term></subject></college>\"\n" +
"}";
testJsonToXml(XSLT_PATH, JSON);
System.out.println();
JSON = "{\n" +
" \"color\": \"red\",\n" +
" \"value\": \"#f00\"\n" +
"}";
testJsonToXml(XSLT_PATH, JSON);
System.out.println();
}
static void testJsonToXml(String xsl, String json) throws SaxonApiException {
OutputStream outputStream = System.out;
Processor processor = new Processor(false);
Serializer serializer = processor.newSerializer();
serializer.setOutputStream(outputStream);
XsltCompiler compiler = processor.newXsltCompiler();
XsltExecutable executable = compiler.compile(new StreamSource(new File(xsl)));
XsltTransformer transformer = executable.load();
transformer.setInitialTemplate(new QName("init"));
transformer.setParameter(new QName("jsonText"), new XdmAtomicValue(json));
transformer.setDestination(serializer);
transformer.transform();
}
}
При компиляции и запуске против Saxon 9.8.0.3 HE я получаю вывод
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<string key="student">john</string>
<string key="class">Bachelors</string>
<string key="subjects">
<college xmlns="">
<subject>
<subjects>maths</subjects>
<term>spring</term>
</subject>
</college>
</string>
</map>
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<string key="color">red</string>
<string key="value">#f00</string>
</map>
и никаких ошибок. Таблица стилей показана выше, без предустановленного содержимого параметра:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="jsonText"></xsl:param>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template name="init">
<xsl:apply-templates select="json-to-xml($jsonText)"/>
</xsl:template>
<xsl:template match="string[@key = 'subjects']" xpath-default-namespace="http://www.w3.org/2005/xpath-functions">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:sequence select="parse-xml(.)/node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
person
Martin Honnen
schedule
24.07.2017
""{\n"
компилируется. Поэтому вы можете потратить время на подготовку минимального, но полного и хорошо отформатированного примера кода, который позволит другим воспроизвести проблему. И, возможно, даже начать новый вопрос, если запуск Saxon с Java является проблемой, первое предложение все еще читается. При преобразовании в поля XML в данных в темах отсутствует структура XML, и если ответ на это дан, довольно странно редактировать вопрос, чтобы задать о новой проблеме. - person Martin Honnen   schedule 24.07.2017<xsl:output method="json"/>
или<xsl:output method="adaptive"/>
в XSLT должно быть достаточным, если ваша таблица стилей возвращает карту или массив. - person Martin Honnen   schedule 25.07.2017