XSLT-使用java动态创建元素

时间:2015-05-28 21:05:27

标签: java xml xslt

我有一个方法应该创建,然后将xsl:template标记附加到下面给出的xml文件中。

爪哇:

...
tF = TransformerFactory.newInstance();
DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
fact.setNamespaceAware(true);
DocumentBuilder builder2 = fact.newDocumentBuilder();
id = builder2.parse(ctx.getRealPath("/WEB-INF/identity.xsl"));
...
attributes_only(id);

StreamSource xmlSource = new StreamSource(ctx.getResourceAsStream("/WEB-INF/input.xml"));
response.setContentType("text/html");

DOMSource ds_id = new DOMSource(id);
Transformer mine = tF.newTransformer(ds_id);
DOMResult output = new DOMResult();
mine.transform(xmlSource, output);
...
private void attributes_only(Document d) {
    Element root = d.getDocumentElement();

    Element e = d.createElement("xsl:template");
    e.setAttribute("match","a|b|c");
    root.appendChild(e);
}
...

XML:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
   <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
   </xsl:copy>
</xsl:template>

<!--    This is what I want to achieve
<xsl:template match="a|b|c">
</xsl:template>
--> 
</xsl:stylesheet>

我正在使用org.w3c.dom,除了这个方法外,一切运行正常。错误消息(来自tomcat)类似于“xsl:模板在样式表中的此位置不允许”,并生成一个空的xml。有没有人知道什么是错的?

提前谢谢

2 个答案:

答案 0 :(得分:1)

也许您可以尝试使用setPrefix,createElementNS等设置template-element的命名空间。当您通过dom添加元素时,它可能不知道您通过前缀表示的命名空间。

答案 1 :(得分:0)

要在名称空间感知的DOM树中创建元素和属性,您需要使用方法的DOM级别2 *NS版本,而不是在命名空间之前的(古老)DOM级别1方法。 / p>

Element e = d.createElementNS("http://www.w3.org/1999/XSL/Transform", "xsl:template");
e.setAttributeNS(null, "match","a|b|c");