1

我正在用 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 中做到这一点,但这只是一个示例。

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

4

1 回答 1

0

transformer.transform 采用 javax.xml.transform.Source,它也可以是 DOMSource。

javax.xml.transform.dom.DOMSource 有一个接受节点的构造函数。

当你评估你的 xpath 表达式时,请求一个 NODE 作为返回值。( text 是默认值)并在其上调用 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 表达式。您缺少属性上的“@”。

于 2013-08-22T15:28:30.453 回答