2010-10-06 3 views
10

Je veux extraire de la valeur de l'attribut name de la balise suivanterequête XPath comment obtenir la valeur d'un attribut basé sur deux attributs

<application 
    comments="Do not erase this one" 
    executable="run_CIET" 
    icon="default" 
    instances="1" 
    mode="1" 
    name="CIET" 
    order="10" 
    selection="1" 
    tool="y" 
/> 

Je peux facilement obtenir la valeur de la valeur de l'attribut name basé sur la valeur de mode comme indiqué ci-dessous

xpath Applications.xml '//applications/application[@mode='3']'/@name 

Mais si je veux ajouter plus condtion qui est « obtenir la valeur d'attribut name = lorsque le mode X et l'attribut de l'outil est pas là dans la balise d'application »

Comment pouvons-nous e est? J'ai essayé quelque chose comme

xpath Applications.xml '//applications/application[@mode='3' and [email protected]]'/@name 

mais son ne fonctionne pas.

Je n'ai jamais utilisé XPath auparavant et je trouve cela compliqué de chercher l'aide de W3C sur XPath mais je n'ai pas trouvé ce que je voulais. S'il vous plaît aider.

+0

Bonne question, +1. Voir ma réponse pour une explication de votre problème, une solution courte et complète et quelques recommandations. :) –

Répondre

16
How do we do this? I tried something like 

    xpath Applications.xml '//applications/application[@mode='3' and [email protected]]'/@name 

but its not working. 



[email protected] 

est une syntaxe non valide dans XPath. Il y a un opérateur !=, mais pas d'opérateur !.

Utilisation:

//applications/application[@mode='3' and not(@tool)]/@name 

Il y a deux choses que vous devriez toujours essayer d'éviter:

  1. en utilisant l'opérateur != - il a définition étrange et ne se comporte pas comme le not() fonction - ne l'utilisez jamais si l'un des opérandes est un ensemble de nœuds. Essayez d'éviter autant que possible l'utilisation de l'abréviation // - cela peut provoquer une inefficacité significative et a également un comportement anormal qui n'est pas apparent à la plupart des gens.

5

L'utilisation de not(@tool) au lieu de [email protected] devrait faire le travail. Si votre moteur XPath ne se comporte pas, vous pouvez éventuellement faire count(@tool)=0, mais cela ne devrait pas être nécessaire.

Questions connexes