如何在标签内查询 XML?

How to query XML inside a tag?

我正在尝试使用下面 xml 中的 attribute 标签查询位置值。我该怎么做?

我当前查询仅 returns full 属性标签的值,但我只想要位置的值,在本例中为 "sampleLocation"?

即:location="sampleLocation"

XML:

<Products>
    <Product>
        <name>Sample name</name>
        <attribute id="sampleid" location="sampleLocation" type="sampleType"/>
    </product>
</Products> 

当前代码:

  public String getLocationByName(String name) {
        final String nameToQueryFor = name;
        return engine.new Query<String>(MY_COLLECTION) {

            @Override
            protected String query(Collection collection) throws Exception {
                XQueryService service = queryService();

                ResourceSet resourceSet = service.query(
                        format("//Products/Product[name='%s']" +
                                        "/attribute"
                                , StringEscapeUtils.escapeXml(nameToQueryFor)
                        ));

                List<String> results = newArrayList();

                for (String resource : new IterableStringResources(resourceSet)) {
                    results.add(resource);
                }
                return results.get(0);
            }
        }.execute();
    }

[为 'location' 编辑 + 更正]

"//Products/Product/name[text()=%s]/next-sibling::attribute/a‌​ttribute::location"

翻译:在 //Products/Product select 的上下文中,元素 <name> 具有给定的文本。然后获取具有 <attribute> 类型的下一个兄弟元素,从中获取 location 属性(该元素的)

的值

'xpath location paths'straight from the horse's mouth的一些例子。

我的建议是

//Product[child::name/text()={$nameToQueryFor}]/attribute/@location

这仅在变量绑定到元素类型的值时有效

我能够使用以下查询解决此问题:

"//Products/Product[name='%s']/attribute/@Location/string()"

哪个returns:"sampleLocation"

注意:最后没有使用 /string() 会给出错误:

attribute 'Location' has no parent element