0

別の要素の属性に従って要素を選択する XPath クエリを構築しようとしています。私のXMLは次のようになります:

<datadoc>
     <data>
    <molecule coorddimension="3">
      <properties>
        <property name="Mol2_MolInfo_Name" type="stringvalue">
          <val>ZINC01532215_1</val>
        </property>        
      </properties>
      <atom key="0" element="6" x="8.2965" y="42.3268" z="14.1097">
        <properties>
          <property name="AtomName" type="stringvalue">
            <val>C1</val>
          </property>         
        </properties>
      </atom>       
      <atom key="9" element="6" x="7.3131" y="43.2537" z="13.9462">
        <properties>
          <property name="AtomName" type="stringvalue">
            <val>C10</val>
          </property>        
        </properties>
      </atom>               
      <bond atomref1="0" atomref2="9" type="double">
        <properties>
          <property name="BondSybylType" type="stringvalue">
            <val>ar</val>
          </property>
        </properties>
      </bond>
     </molecule>
    </data>
  </datadoc>

基本的に私が望むのは、@key 属性が @atomref1 y @atomref2 結合の属性の結合によって参照される Atom を選択することです。それだけです。Bond ノードにいて、その Bond によって参照される Atom 要素を取得します。

私が試したのは次のようなものです:

../atom[@key = ./@atomref1]

.. を使用するのは、クエリを実行するときに Bond ノードにいるためですが、うまくいかないようです。XPathでそれを行うことができる場合、何かアイデアはありますか?

ありがとう。

4

2 に答える 2

0

述語 on 内にいるときは外部コンテキストにアクセスできないため、純粋な xpath (この特定の結合に参加するアトムを見つける) でこれを達成できるとは思いませんatom。XSLT を使用している場合はcurrent()、外部コンテキストへの参照を提供する関数を使用できます。

../atom[@key = (current()/@atomref1| current()/@atomref2)]

ただし、これは XSLT 固有の関数であり、標準の XPath では使用できません。

XPath 式の実行方法によっては、変数バインディングを提供できる場合があります。コメントで Java で作業していると述べているため、javax.xml.xpath を使用した例を次に示します。

class MapVariableResolver extends HashMap<String, Object> implements XPathVariableResolver {
  public Object resolveVariable(QName name) {
    return get(name.getLocalPart());
  }
}

XPath xp = XPathFactory.newInstance().newXPath();
MapVariableResolver mvr = new MapVariableResolver();
xp.setXPathVariableResolver(mvr);

Node bond = // ... however you get the bond element
mvr.put("current", bond);
NodeList atoms = (NodeList)xp.evaluate(
    "../atom[@key = ($current/@atomref1| $current/@atomref2)]",
    bond,
    XPathConstants.NODESET);
于 2013-08-26T13:39:55.697 に答える