我正在使用 Java 学习 XML 和 XSLT。很久以前,我已经使用这些技术使用 ASP 3 和 Javascript 创建了一些应用程序。现在我正在尝试记住一些 Xpath 技术并了解如何在 Java 中实现这一点。
我过去常常创建一个 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 中执行此操作?
- 我知道我可以使用简单的 Xpath 在 XSL 中完成此操作,但这只是一个示例。
如果我不清楚,请告诉我。
最佳答案
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 表达式。您缺少属性上的“@”。
关于java - 如何将Xpath的结果变成我的输出结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18384345/