java - 如何找到嵌套在两个不同标签中的两个同名节点的位置?

标签 java xml xslt xpath

我有以下 XML:

<employees>
   <employee>   <!--forgot to include an attribute-->
      <name>John</name>
      <jobs>
          <job>Writer</job>
          <job>Artist</job>
     </jobs>
   </employee>
   <employee>
      <name>John</name>
      <jobs>
          <job>Engineer</job>
          <job>Editor</job>
     </jobs>
   </employee>
</employees>

如果我想获得名称为“John”的人的工作,XPath 会返回属于一个“John”的所有四个工作。我希望由两个不同的“John”分别完成 2+2 个不同的工作。

我使用 XPath 表达式

"//employees/employee[name='John']/jobs/job/text()"

在 Java 的 XPath 中有没有一种方法可以使用计数或其他一些函数来做到这一点?

最佳答案

XPath(仅)是一种用于 XML 文档的查询语言 -- XPath 表达式的计算结果永远不会修改节点 -- XPath 本身不会更改结构和/或内容任何节点。

要返回的内容已修改<employee>只有 <jobs> 的元素 child ,这不能单独使用 XPath 来实现。

最接近你想要的是:

/*/employee[name='John']/jobs

这会选择以下内容:

    <jobs>
        <job>Writer</job>
        <job>Artist</job>
    </jobs>
    <jobs>
        <job>Engineer</job>
        <job>Editor</job>
    </jobs>

我猜想通过这个 XSLT 转换可以绝对轻松地产生您想要的结果:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/*/employee[name='John']/node()[not(self::comment())]"/>
 </xsl:template>
 </xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<employees>
    <employee>
        <!--forgot to include an attribute-->
        <name>John</name>
        <jobs>
            <job>Writer</job>
            <job>Artist</job>
        </jobs>
    </employee>
    <employee>
        <name>John</name>
        <jobs>
            <job>Engineer</job>
            <job>Editor</job>
        </jobs>
    </employee>
</employees>

产生了想要的、正确的结果:

<name>John</name>
<jobs>
   <job>Writer</job>
   <job>Artist</job>
</jobs>
<name>John</name>
<jobs>
   <job>Engineer</job>
   <job>Editor</job>
</jobs>

关于java - 如何找到嵌套在两个不同标签中的两个同名节点的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5977262/

相关文章:

xml - 如何使用 XPath 和 XSLT 处理一组兄弟节点并根据其中两个兄弟节点处理特定的兄弟节点子集

URL 和 & 符号

java - JavaFX Action 事件处理程序

ios - iOS中的数据表

android - 我应该在基于 Cordova 的项目中的什么地方包含 ITelephony.aidl?

javascript - 仅在单击链接时执行一些 XSLT

java - 为什么通过 Ghostscript API 渲染图像需要这么长时间?

java - 使用java流在 map 中按值分组

Java - 以 10 的批量读取大型 .text 数据文件

java - JAXB XJC 代码生成 - Marshaller 生成的 xml 中缺少 "schemaLocation"