java - 如何将Xpath的结果变成我的输出结果?

标签 java xml xslt xpath

我正在使用 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/

相关文章:

python - 如何解析大型 xml 文件中的一些数据?

xslt - 如何在 XSLT 中计算数字的绝对值?

java - 扫描仪不会读取文件中的下一行。 java

java - 最佳实践 : Map object properties from string collection

java - 在值对象中存储常量

php - 无法在 PHP 中解码 UTF8?

xml - 导出到 XML 的基本标准?

JSON 到 XSLT : default XML node if JSON element does NOT exist

XSLT:如果节点不存在,则创建节点?

java - 如何将我的 log4j.properties 设置为我的类路径