2010-11-17 6 views
0

Je rencontre un problème lors de la création d'une requête xpath. J'essaie d'obtenir des produits qui ont un serviceTechnology = 'DSL'.Requête xpath avec des prédicats

J'ai essayé:

//offering/productDefinition[definitionID='Product_1' or definitionID='Product_2' or definitionID='Product_3' or definitionID='Product_4' and serviceTechnologyList[serviceTechnology='DSL']]

//offering/productDefinition[definitionID='Product_1' or definitionID='Product_2' or definitionID='Product_3' or definitionID='Product_4' and serviceTechnologyList='DSL']

Cette décision était fondée sur une autre liste de questions. Je continue d'obtenir "Predicate Format Error".

<offeringList> 
    <offering> 
     <productDefinition> 
      <definitionID>Product_1</definitionID> 
      <productLineList> 
       <productLine>DSL</productLine> 
      </productLineList> 
      <serviceTechnologyList> 
       <serviceTechnology>DSL</serviceTechnology> 
      </serviceTechnologyList> 
     </productDefinition> 
    </offering> 
    <offering> 
     <productDefinition> 
      <definitionID>Product_2</definitionID> 
      <productLineList> 
       <productLine>DSL</productLine> 
      </productLineList> 
      <serviceTechnologyList> 
       <serviceTechnology>IPTV</serviceTechnology> 
      </serviceTechnologyList> 
     </productDefinition> 
    </offering> 
    <offering> 
     <productDefinition> 
      <definitionID>Product_3</definitionID> 
      <productLineList> 
       <productLine>DSL</productLine> 
      </productLineList> 
      <serviceTechnologyList> 
       <serviceTechnology>DSL</serviceTechnology> 
      </serviceTechnologyList> 
     </productDefinition> 
    </offering> 
    <offering> 
     <productDefinition> 
      <definitionID>Product_4</definitionID> 
      <productLineList> 
       <productLine>DSL</productLine> 
      </productLineList> 
     </productDefinition> 
    </offering> 
</offeringList> 

Toute aide serait appréciée.

+0

Les deux expressions XPath sont syntaxiquement correctes. Si vous obtenez une erreur, cela signifie que vous utilisiez des expressions différentes ou que le moteur XPath que vous utilisez est buggé/non conforme. –

Répondre

0

Pourquoi ne pas simplement:

/offeringList/offering/productDefinition[serviceTechnologyList/serviceTechnology = 'DSL'] 

Ou vous pouvez faire ce qui suit si vous voulez être précis sur definitionIDs:

//offeringList/offering/productDefinition[serviceTechnologyList/serviceTechnology = 'DSL'][definitionID='Product_1' or definitionID='Product_2' or definitionID='Product_3' or definitionID='Product_4'] 
+0

Il y a environ 60+ produits au total et tous n'ont pas de technologie de service 'DSL'. Je veux seulement les produits qui ont la définitionID spécifique et ont une technologie de service de «DSL». – Scott

+0

Mark, j'ai utilisé la deuxième suggestion avec les ID de définition spécifiques et cela semble fonctionner. Merci pour l'aide. – Scott

1

Je ne vois pas d'erreurs à vue - à la fois le travail :), peut-être vous n'échappez pas à quelque chose?

Essayez vos questions ici pour voir que ok travail: xpath tester

0

Vous devez entre parenthèses pour définir la priorité des and et or opérateurs:

//offering/productDefinition[(definitionID='Product_1' or definitionID='Product_2' or definitionID='Product_3' or definitionID='Product_4') and serviceTechnologyList[serviceTechnology='DSL']] 

Si vous voulez juste productDefinition nœuds qui ont serviceTechnology='DSL', vous peut simplifier à quelque chose comme:

//productDefinition[serviceTechnologyList[serviceTechnology='DSL']] 
+0

Il y a environ 60+ produits au total et tous n'ont pas de service technique de 'DSL'. Je veux seulement les produits qui ont la définitionID spécifique et ont une technologie de service de «DSL». – Scott

+0

OK, alors le premier devrait fonctionner correctement. Avez-vous encore des problèmes? –

+0

Je pense que je vais bien maintenant. Merci – Scott

0

As @ icyrock.com po ints out, le problème est dans les opérateurs booléens: and a plus de priorité que or.

Cette expression utilise une autre approche pour la comparaison avec une séquence XPath 1.0:

//offering/productDefinition 
      [contains('|Product_1|Product_2|Product_3|Product_4|', 
         concat('|',definitionID,'|')) 
       and serviceTechnologyList/serviceTechnology='DSL'] 

Si la liste des ID est trop grand, vous pouvez utiliser:

//offering/productDefinition 
      [starts-with(definitionID,'Product_') 
       and contains('|1|2|3|4|6|8|22|', 
          concat('|', 
            substring-after(definitionID, 
                'Product_'), 
            '|')) 
       and serviceTechnologyList/serviceTechnology='DSL'] 

Ou s'il y a un Plage:

//offering/productDefinition 
      [starts-with(definitionID,'Product_') 
       and substring-after(definitionID,'Product_') >= 1 
       and 4 >= substring-after(definitionID,'Product_') 
       and serviceTechnologyList/serviceTechnology='DSL']