我将如何编写 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 表达式时,将选择两个元素 - root
和 subitem
。
我认为只需要这两个元素中的第二个元素。为此,请使用以下 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/