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] 

どちらも役に立ちませんでした。その結果、属性の1つを持つXMLからすべてのノードを取得しましたが、指定されたノードnの子ノードのみを取得したいと思います。私も試しました

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

表現としてですが、それもうまくいきませんでした。

誰かが私の問題を解決する方法を考えていますか?

4

3 に答える 3

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 に答える
0

あなたが欲しいのは次のようです:

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

//*[@base or @ref or @type] その結果、属性の1つでXMLからすべてのノードを取得しましたが、指定されたノードnの子ノードのみを取得したい

これは、'//' がドキュメント全体を検索するためです。述語は正しいですが、フィルタリングしているシーケンスが間違っています。コンテキスト ノードの子を取得するには、次を使用します。

*[@base or @ref or @type]

ちなみに、スキーマ内の他の宣言を参照する QName を含む XSD 内のすべての属性をリストしようとしている場合、リストは不完全です。

于 2012-07-20T08:37:47.190 に答える