我試圖解析一個很簡單的例子:javax.xml.transform.Transformer忽略前綴?
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/'>
<openSearch:totalResults>100</openSearch:totalResults>
</root>
我使用的樣式表如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:app='http://www.w3.org/2007/app' >
<xsl:output method="xml" indent="yes"/>
<xsl:preserve-space elements="*"/>
<xsl:template match="/">
<results>
<xsl:attribute name="total-results">
<xsl:value-of
select="atom:root/openSearch:totalResults"/>
</xsl:attribute>
</results>
</xsl:template>
</xsl:stylesheet>
這工作在的libxslt,沒有問題。我正試圖在java中執行相同的任務,並且正在嘗試使用javax.xml.transform包來執行此操作。它不是預期的結果,它爲總結果屬性提供了一個空值。但是,當我改變這個值:
<xsl:value-of select="root/totalResults"/>
它的工作原理。更改xml和xslt不是一個選項。有一個參數我應該設置在某個地方?代碼非常簡單:
InputSource xmlSource = new InputSource(new StringReader(xml));
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(xmlSource);
// Use a Transformer for output
TransformerFactory tFactory = TransformerFactory.newInstance();
StreamSource stylesource = new StreamSource(new StringReader(styleSheet));
Transformer transformer = tFactory.newTransformer(stylesource);
StringWriter writer = new StringWriter();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(writer);
transformer.transform(source, result);
stringResult = writer.toString();
你說改變XSLT不是一種選擇,但是XSLT是錯誤的。您正在使用兩個未定義的名稱空間前綴,並且其中一個前綴不應存在。 – JLRishe 2013-02-13 09:07:37
我無法重現您描述的行爲:xsltproc不接受您提供的樣式表,但由於未定義前綴而引發命名空間錯誤。你想要儘可能小的例子來說明行爲 - 但不是更小的! – 2013-02-13 15:47:41
你說得對。我的問題最終出現在Java代碼中(請參閱接受的答案),但在將來發布代碼時我會更加小心。 – user1532390 2013-02-13 18:31:31