2013-08-22 84 views
1

我正在學習使用Java的XML和XSLT。我已經使用這些技術很久以前用ASP 3和Javascript創建了一些應用程序。現在我正在嘗試使用Xpath記住一些技巧,並瞭解如何在Java中進行此操作。如何做Xpath的結果成爲我的輸出結果?

我曾經在過去製作一個Xpath來從XML獲取一些元素並將其轉換爲我的HTML輸出。我一直試圖在java中做同樣的事情,但我認爲我有點失落。

我已經在這裏尋找其他人的帖子,但通常這些樣本只是獲取節點的值並顯示在一個循環中。我想獲得一段XML並將其轉換爲輸出HTML。

我有這個簡單的樣品波紋管,它工作正常。

Source source = new StreamSource("catalog.xml"); 
    Source xsl = new StreamSource("catalog.xsl"); 
    //Result result = new StreamResult(System.out); 
    Result result = new StreamResult("output.html"); 

    TransformerFactory factory = TransformerFactory.newInstance(); 
    Transformer transformer = factory.newTransformer(xsl); 
    transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
    transformer.transform(source, result); 

我正在使用javax.xml。 。我看到了幾個使用javax.xml.xpath的例子。。我也測試了一些Xpath的例子。

但到目前爲止,我還沒有意識到如何從XML獲取代碼片段代碼,並將其轉換爲我的output.html文件。

我的XML:

<catalog> 
    <cd active="1"> 
     <title>Empire Burlesque</title> 
     <artist>Bob Dylan</artist> 
     <country>USA</country> 
     <company>Columbia</company> 
     <price>10.90</price> 
     <year>1985</year> 
    </cd> 
    <cd active="1"> 
     <title>Hide your heart</title> 
     <artist>Bonnie Tyler</artist> 
     <country>UK</country> 
     <company>CBS Records</company> 
     <price>9.90</price> 
     <year>1988</year> 
    </cd> 
    <cd active="0"> 
     <title>Greatest Hits</title> 
     <artist>Dolly Parton</artist> 
     <country>USA</country> 
     <company>RCA</company> 
     <price>9.90</price> 
     <year>1982</year> 
    </cd> 

</catalog> 

例如,如果我想在我output.html改造只是這個XPath波紋管:

XPathExpression expr = xpath.compile("//catalog/cd[active='0']"); 

如何做到這一點在我的Java?

  • 我知道我可以在我的XSL中用一個簡單的Xpath來做到這一點,但這只是一個例子。

如果我不清楚,請告訴我。

+0

只是爲了讓舒爾知道你是正確的。您正在嘗試通過在Java中選擇XPath部分來將Source.xml文件的一部分轉換爲目標,而不更改源xml或xsl? – treeno

+0

您的xpath在屬性:// catalog/cd [@ active ='0']上缺少「@」 –

+0

@treeno是的。這是主意。 – Ventura

回答

0

transformer.transform需要一個javax.xml.transform.Source,它也可以是一個DOMSource。

javax.xml.transform.dom.DOMSource有一個構造函數,它接受一個節點。

當您評估xpath表達式時,請求一個NODE作爲返回值。 (文本是默認的),並將其作爲源代碼調用DOMsource。

在Jython中,例如,它會是這樣的:

from javax.xml.transform.stream import StreamSource, StreamResult 
from javax.xml.transform import * 
from javax.xml.xpath import * 
from org.xml.sax import InputSource 
from javax.xml.xpath.XPathConstants import * 
from javax.xml.transform.dom import DOMSource 

xsl=StreamSource('catalog.xsl') 
# source = StreamSource('catalog.xml') 
result = StreamResult('output.html') 

xfact=XPathFactory.newInstance() 
xpath=xfact.newXPath() 
expr = xpath.compile("//catalog/cd[@active='0']") 
x=expr.evaluate(InputSource('catalog.xml'), NODE) 

factory = TransformerFactory.newInstance() 
transformer = factory.newTransformer(xsl) 

transformer.setOutputProperty(OutputKeys.INDENT, "yes") 
transformer.transform(DOMSource(x), result) 

沒有錯誤在此版本檢查: 您可能要問了NODESET代替,並檢查是否有一個且只有一個返回值。

我修正了你的xpath表達式。你錯過了屬性上的'@'。

+0

修改我的代碼之後,我在我的catalog.xml中出現了一個java.io.FileNotFoundException異常,這很奇怪,因爲這個文件在同一個地方繼續工作,並且工作正常。 – Ventura

+0

請忘記這個例外,這是我的錯誤。現在一切都好了。我只是測試XPath。 – Ventura