1

<subitem>以下のXMLスニペットの要素に一致するxpathクエリを作成するにはどうすればよいですか?

具体的には、ルートの「name」属性の値と一致する「name」属性を持つ要素を一致させたいと思います。との間には任意の数の祖先が存在する可能性があり<root>ます<subitem>

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

私の目標は、ステートメントが含まれているクラスとは異なるクラスを使用するLogger.getLogger()のケースを見つけるためのPMDルールを作成することです。

4

2 に答える 2

1

このXPath式を使用します

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

これにより、属性が最上位要素の属性と同じ文字列値を持つ任意の要素(という名前の最上位要素を含むroot)が選択されます。このXPath式が提供されたXMLドキュメントに対して評価されると、2つの要素-とが選択されます。namenamerootsubitem

この2つのうち2つ目の要素だけが欲しいと思います。これには、次の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>

2つのXPath式が評価され、選択したノードが出力にコピーされます。

<subitem name="xyz"/>
========
   <root name="xyz">
    <anything>
      <subitem name="xyz"/>
    </anything>
   </root>
   <subitem name="xyz"/>
于 2012-06-29T04:14:57.473 に答える
0

//*[@name=(ancestor::*/@name)]

これでうまくいくはずです。「同じ祖先を持つすべてのノードを検索する」と読みますname


編集(プラス2つ目、それでも選択が多すぎます)

質問の編集後:

//*[@name=(/@name)]

nameこれは、 「ルートノードと同じノードをすべて検索する」と表示されます。ルートノードは思ったとおりではない可能性があり(ルートrootではなく、という名前の最上位ノードと照合する必要がある)、次のように実装する必要がある場合があることに注意してください。

//*[@name=(/root/@name)]また//*[@name=(/*/@name)]


subitemこれにより、不要なとの2つの要素が選択されます。最上位ではない(の子孫である)rootノードのみを選択する必要があります。このためのDimitreNovatchevへのクレジット。root

//*/*[@name=(/*/@name)]

于 2012-06-28T20:10:44.457 に答える