java - 与祖先具有相同属性值的项目的 Xpath

标签 java xml xpath substitution pmd

我将如何编写 xpath 查询来匹配 <subitem>下面的 XML 片段中的元素?

具体来说,我想匹配任何具有与根的“name”属性值匹配的“name”属性的元素。 <root> 之间可能有任意数量的祖先和<subitem> .

<root name="xyz">
  <anything>
    <subitem name="xyz" />
  </anything>
</root>

我的目标是编写一个 PMD 规则来查找 Logger.getLogger() 的情况,这些情况使用的类与语句所在的类不同。

最佳答案

使用此 XPath 表达式:

//*[@name = /*/@name]

这将选择任何元素(包括名为 root 的顶部元素),其 name 属性与顶部元素的 name 属性具有相同的字符串值。当根据提供的 XML 文档计算此 XPath 表达式时,将选择两个元素 - rootsubitem

我认为只需要这两个元素中的第二个元素。为此,请使用以下 XPath 表达式:

//*/*[@name = /*/@name]

基于 XSLT 的验证:

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

 <xsl:template match="/">
   <xsl:copy-of select="//*/*[@name = /*/@name]"/>
========
   <xsl:copy-of select="//*[@name = /*/@name]"/>
 </xsl:template>
</xsl:stylesheet>

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

<root name="xyz">
    <anything>
        <subitem name="xyz" />
    </anything>
</root>

计算两个 XPath 表达式并将所选节点复制到输出:

<subitem name="xyz"/>
========
   <root name="xyz">
    <anything>
      <subitem name="xyz"/>
    </anything>
   </root>
   <subitem name="xyz"/>

关于java - 与祖先具有相同属性值的项目的 Xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11251991/

相关文章:

java - 电子邮件收到两次,但我只想要一次

java - 如何让对象访问其调用对象的变量并修改它们?

android - 如何在 Android 中并排显示两个图像?

Java - 子节点的 dom4j XPath

java - 在Java中使用Xpath更新Xml标签的值

java - 如何拆分 XML

java - 使用 maven 运行单个测试方法

java - 用于日历 View 的 GridView

java - JAXB 适配器返回 xml 节点或原始 xml 文本而不是对象

java - 在 Java 中基于 XPath 创建 XML 节点