2015-05-28 5 views
1

У меня есть метод, который должен создать, а затем добавить тег xsl: template в xml-файл, указанный ниже.XSLT-Создание элементов динамически с помощью java

Java:

... 
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

Почему вы преобразовываете таблицу стилей с использованием Java и DOM, а не используете XSLT? –

ответ

0

Чтобы создать элементы и атрибуты в дереве DOM, поддерживающем пространство имен, вам необходимо использовать варианты методов DOM уровня 2, а не методы древнего DOM уровня 1, которые предписывают пространства имен.

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

Это сделало работу! Спасибо. – user2879198

1

Может быть, вы можете попробовать установить пространство имен-шаблона элемента с setPrefix, createElementNS или тому подобное. Когда вы добавляете элемент через dom, он может не знать о пространстве имен, которое вы подразумеваете под префиксом.

Смежные вопросы