我有以下 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/