2010-07-12 2 views
1

J'extrait de code XML suivant lesutiliser XPath pour trouver l'élément approprié en fonction de la valeur de l'élément

 <ZMARA01 SEGMENT="1"> 
      <CHARACTERISTICS_01>X,001,COLOR_ATTRIBUTE_FR,BRUN ÉCORCE,TMBR,French C</CHARACTERISTICS_01> 
      <CHARACTERISTICS_02>X,001,COLOR_ATTRIBUTE,Timber Brown,TMBR,Color Attr</CHARACTERISTICS_02> 
     </ZMARA01> 

Je cherche une expression XPath qui correspondront basé sur COLOR_ATTRIBUTE. Ce ne sera pas toujours dans CHARACTERISTIC_02. Cela pourrait être CHARACTERISTIC_XX. De plus, je ne veux pas faire correspondre COLOR_ATTRIBUTE_FR. J'utilise ceci:

Transaction.Input_XML{/ZMAT/IDOC/E1MARAM/ZMARA01/*[starts-with(local-name(.), 'CHARACTERISTIC_')][contains(.,'COLOR_ATTRIBUTE')]} 

Cela me reçoit la plupart du temps là-bas, mais il correspond à la fois COLOR_ATTRIBUTE et COLOR_ATTRIBUTE_FR

+0

Bonne question (+1). Voir ma réponse pour une solution très simple. :) –

Répondre

1

Utilisation:

contains(concat(',', ., ','), ',COLOR_ATTRIBUTE,') 

Cette première entoure la valeur de chaîne du nœud contextuel par des virgules, puis teste simplement si la chaîne contient donc cunstructed ',COLOR_ATTRIBUTE,'.

Ainsi nous traitons tous les cas (motif au début de la chaîne, motif à la fin de la chaîne et motif ni au début ni à la fin) de la même manière.

0

Si COLOR_ATTRIBUTE est garantie de ne pas être la première ou dernière position, vous pouvez utiliser [contains(.,',COLOR_ATTRIBUTE,')], sinon vous pourrait utiliser quelque chose comme [contains(.,'COLOR_ATTRIBUTE') and not contains(.,'COLOR_ATTRIBUTE_FR')].

+0

Puis-je utiliser un caractère générique pour le ne contient pas comme 'COLOR_ATTRIBUTE_ *' ou quelque chose? – mpenrow

+0

Non, vous devrez utiliser quelque chose comme '[starts-with (substring-after (., 'COLOR_ATTRIBUTE'), ',')]' – reece

Questions connexes