怎么做Xpath的结果成为我的输出结果?

时间:2013-08-22 15:10:06

标签: java xml xslt xpath

我正在使用Java学习XML和XSLT。我很久以前用ASP 3和Javascript使用这些技术创建了一些APP。现在我试图用Xpath记住一些技术,并了解如何用Java创建它。

我过去常常使用Xpath从XML中获取一些元素并将其转换为HTML输出。我一直试图在java中做同样的事情,但我觉得我有点失落。

我已经在其他帖子中查找过,但通常样本只是获取Node的值并在循环中显示。我想获得一段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中执行此操作,但这只是一个示例。

如果我不清楚,请告诉我。

1 个答案:

答案 0 :(得分: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表达式。你错过了属性上的'@'。