如何在没有源文件的情况下使用XSL创建XML



我想使用xsl文件创建xml文件,它将只使用内存中的数据(不使用源文件)。我有下面的代码,但我不确定用什么代替源文件

部分,例如:

<ExternalReference>
<xsl:value-of select="erstefnImport:retriveXslExternalReference()" />
</ExternalReference>

代码部分:

if (xsltFile != null) {
Transformer transformer = getTransformer(xsltFile);
Source source = null;
try {
source = new StreamSource(new FileInputStream(null));// ??
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
StreamResult outputTarget = new StreamResult(byteOutputStream);
if (transformer != null) {
try {
transformer.transform(source, outputTarget);
rst = new String(byteOutputStream.toByteArray());
} catch (Exception e) {
Log.error(this, "Error while transforming xml.", e);
}
}
}

我试图使用文档作为源,但输出只有:

<?xml version="1.0" encoding="iso-8859-1"?>

代码:

if (xsltFile != null) {
Transformer transformer = getTransformer(xsltFile);
Source source = null;
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
Document docResult = null;
try {
docResult = docFactory.newDocumentBuilder().newDocument();
} catch (ParserConfigurationException e2) {
e2.printStackTrace();
}
DOMSource domSource = new DOMSource(docResult);
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
StreamResult outputTarget = new StreamResult(byteOutputStream);
if (transformer != null) {
try {
transformer.transform(domSource, outputTarget);
rst = new String(byteOutputStream.toByteArray());
} catch (Exception e) {
Log.error(this, "Error while transforming xml.", e);
}
}
}

XSLT 1.0,这样XSLT 1.0处理器的api基本上是围绕处理源树作为XSLT样式表输入的思想构建的。

这在XSLT 2和XSLT 3中是不同的,在XSLT 2中您可以使用命名模板开始处理,在XSLT 3中也是如此,您也可以通过调用公共函数开始处理。

当你正在使用Java时,你可以很容易地考虑切换到Saxon 10,可以从Sourceforge和Maven的开源HE版本中获得。使用XSLT 3,然后确保使用自己的API https://www.saxonica.com/html/documentation10/using-xsl/embedding/s9api-transformation.html,该API具有callTemplate(https://www.saxonica.com/html/documentation10/using-xsl/embedding/s9api-transformation.html)或callFunction(https://www.saxonica.com/html/documentation10/javadoc/net/sf/saxon/s9api/Xslt30Transformer.html#callFunction-net.sf.saxon.s9api.QName-net.sf.saxon.s9api.XdmValue:A-)等方法。

在XSLT 3中,初始模板有一个预定义的名称

<xsl:template name="xsl:initial-template">
<root>
<foo>bar</foo>
</root>
</xsl:template>

XSLT中的没有预定义的名称,所以您可以选择一个像main这样的名称,例如

<xsl:template name="main">
<root>
<foo>bar</foo>
</root>
</xsl:template>

,然后使用API引用的callTemplate方法使用main名称(我想是new QName("", "main"))。

我发现使用(几乎)空xml源文件将工作。只需要在源xml中使用根标记(在本例中为map),并在xsl template中使用此标记名称:

<xsl:template match="map">

最新更新