gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:49:09 24 4
gpt4 key购买 nike

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

24 4 0