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>

基本上我想要的是选择@atomref1 y @atomref2 键的属性中的键引用@key 属性的原子。就是这样,在 Bond 节点中,获取该 Bond 引用的 Atom 元素。

我尝试的是这样的:

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

我使用 .. 因为当我进行查询时,我在 Bond 节点中,但这似乎不起作用。如果这可以用 XPath 完成,有什么想法吗?

谢谢。

4

2 回答 2

0

我认为您无法在纯 xpath 中实现这一点(查找参与此特定键的原子),因为当您在谓词 on 中时,您无法访问外部上下文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 回答
0

试试这个表达式:

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

如果你想匹配@atomref2:

.//atom[@key=../bond/@atomref2]

如果你想要两个<atom>

.//atom[@key=../bond/@atomref1 or @key=../bond/@atomref2]
于 2013-08-26T10:47:25.980 回答