2009-03-05 7 views
23

Je souhaite effectuer une série d'opérations sur des éléments correspondant au nom "A" ou "B". Je pense à quelque chose comme ça ci-dessous, mais ça ne marche pas.XSLT: Comment représenter OR dans un attribut "match"?

<xsl:template match= " 'A' or 'B'" > 
    <!-- whatever I want to do here --> 
</xsl:template> 

Impossible de trouver la référence de langage XSLT appropriée pour cela. S'il vous plaît aider! Merci!!

+0

Voir aussi: http://stackoverflow.com/q/14057312/20477 25 – w5m

Répondre

23

Généralement A | B est la bonne façon de le faire. Mais le caractère de pipe est fondamentalement une union de deux expressions XPath complètes. Il peut être gênant pour l'utiliser dans un cas comme celui-ci:

/red/yellow/blue/green/gold | red/orange/blue/green/gold 

puisque vous répéter l'intégralité de l'expression à l'exception d'une petite partie de c'est que le changement.

Dans des cas comme cela, il est souvent préférable d'utiliser un prédicat et la fonction name() à la place:

/red/*[name() = 'yellow' or name()='orange']/blue/green/gold 

Cette technique vous donne accès à une gamme beaucoup plus large d'opérations logiques. Il est également (peut-être) plus rapide, car le navigateur XPath doit seulement traverser les nœuds qu'il essaie une fois.

+0

La meilleure réponse et la plus complète pour moi – Grafit

6

<xsl:template match= " 'A' or 'B'" >

Il y a quelques problèmes avec ce modèle de correspondance:

  1. Un modèle inclut nœuds, et non des chaînes. Par conséquent, les noms des éléments à mettre en correspondance ne doivent pas être spécifiés en tant que chaînes entre guillemets. Le XPath operator "or" agit sur deux valeurs booléennes, pas sur des nœuds. Ce qui est nécessaire ici est another XPath operator -- the union operator "|".

Compte tenu de ce qui précède, on spécifier correctement la règle de modèle comme:

<xsl:template match= "A | B" > 
    <!-- whatever I want to do here --> 
</xsl:template> 
10

Je pense qu'il est plus pratique d'utiliser XPath

/red/(yellow | orange)/blue/green/gold 

plutôt que

/red/*[name() = 'yellow' or name()='orange']/blue/green/gold 
+0

Cela ne fonctionne pas dans un attribut 'match' pour' template'. C'est XPATH valide mais pas un modèle valide. –

Questions connexes