我有一个方法应该创建,然后将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。有没有人知道什么是错的?
提前谢谢
答案 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");