1

我想获取包含以下属性之一的每个子节点:type、ref、base。每个属性的值无所谓,我只是想检查该属性是否存在。

这就是我现在的做法:

private void addRequiredNodeAndChildren(Node n) {    
            XPath xpath = XPathFactory.newInstance().newXPath();
            String expression = "*//*[@base or @ref or @type]";
            XPathExpression expr = xpath.compile(expression);
            NodeList referList = (NodeList) expr.evaluate(n, XPathConstants.NODESET);
            ..
}

此表达式工作正常,但在一种情况下,我没有得到所有预期的节点:

 <xs:complexType name="ListElement">
        <xs:annotation>
            <xs:documentation>
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="transferMode" type="myprefix:dataTransferMode"
            use="optional">
            <xs:annotation>
                <xs:documentation>Documentation for attribute
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

我希望得到具有上述表达式的节点,但不幸的是我没有得到它。将表达式更改为

//*[@base or @ref or @type] 

也没有帮助,因为我从 XML 中获取了每个具有属性之一的节点,但我只想获取给定节点 n 的子节点。我也试过

*//*[@base] or *//*[@ref] or *//*[@type]

作为表达,但这也不起作用。

有谁知道如何解决我的问题?

4

3 回答 3

0

//*[@base or @ref or @type] 也没有帮助,因为我从 XML 中获取了每个具有属性之一的节点,但我只想获取给定节点 n 的子节点

那是因为 '//' 搜索整个文档。您的谓词是正确的,但您过滤的顺序是错误的。要获取上下文节点的子节点,请使用

*[@base or @ref or @type]

顺便说一句,如果您尝试列出 XSD 中包含引用架构中其他声明的 QName 的所有属性,那么您的列表是不完整的。

于 2012-07-20T08:37:47.190 回答
0

看来你想要的是:

*[descendant-or-self::*[@base or @ref or @type] ]
于 2012-07-20T13:27:03.247 回答
0

感谢大家的帮助!

我找到了一个不是很漂亮但至少有效的解决方案:

*[@base or @ref or @type] | *//*[@base or @ref or @type]

编辑:我改编了 Dimitre Novatchev 的解决方案,它也解决了这个问题:

descendant-or-self::*[@base or @ref or @type]
于 2012-07-27T05:29:15.970 回答