compter le nombre d'occurrences d'une chaîne de caractères au format XML à l'aide de XSLT
Je veux calcutae le nombre d'occurrences d'une chaîne dans un nœud particulier dans le document XML à l'aide de XSLT.
Considérons cet exemple
<mainNode>
<book>
<price> 100 </price>
<city> chennai </city>
<list>
<language> c java ruby </language>
</list>
</book>
<book>
<price> 200 </price>
<city> banglore </city>
<list>
<language> c java </language>
</list>
</book>
<book>
<price> 300 </price>
<city> delhi </city>
<list>
<language> java ruby </language>
</list>
</book>
</mainNode>
Ici, je veux compter les occurrences de "java"
Je Veux de Sortie ressemble à ceci:: java -- 3
Comment faire??? une idée???
Bonne question, +1. Voir ma réponse pour une complète, court et facile one-liner expression XPath solution. 🙂
Point mineur, mais votre XML est mal conçu. Vous devriez vraiment avoir une liste de
Aussi, vous n'avez pas répertorié dans un exemple, mais pourrait
Point mineur, mais votre XML est mal conçu. Vous devriez vraiment avoir une liste de
<language>
éléments, comme ceci: <list><language>java</language><language>ruby</language></list>
au lieu de l'avoir dans un espace séparé pour une liste à un seul élément; il aurait fait cette triviale de répondre, avec count(//language[.='java'])
.Aussi, vous n'avez pas répertorié dans un exemple, mais pourrait
javascript
apparaître dans la liste des langues?OriginalL'auteur Sathish | 2011-07-13
Vous devez vous connecter pour publier un commentaire.
Utilisation:
La complète transformation XSLT:
lorsqu'il est appliqué sur le document XML fourni par le:
le voulait, résultat correct est produit:
Mise à jour:
Si nous sommes à compter tous d'occurences de la chaîne -- pas seulement à tous les nœuds qui contiennent la chaîne de caractères -- voici comment le faire:
lorsque cette transformation est appliquée sur ce document XML:
le voulait, résultat correct est produit:
Ce code fonctionne bien. Supposons que le nœud de la langue contient plus d'un java comme, <langue> java java ruby <langue>. Maintenant, le comptage doit plus 1, mais il a encore un show 3. Comment obtenir 4?
C'est une toute autre question. Il serait préférable toas cela comme une question distincte. Il est presque minuit où je suis, donc, s'il vous plaît, attendez ma réponse à propos de 8hrs à partir de maintenant.
Dimitre Novatchev: ok man pas de probs, pls faire cela pour moi, j'ai essayé à de nombreuses reprises. Je coudnt l'obtenir. Ce scénario est très important pour moi, alors s'il vous plaît essayer cette....
C'est très différent de réponse, pas une question différente. La question et le titre reportez-vous à compter le nombre d'occurrences d'une chaîne de caractères, et non pas le nombre de nœuds qui contiennent une chaîne de caractères.
OriginalL'auteur Dimitre Novatchev
peut-être vous pouvez essayer ce XSL Modèle de compter les sous-chaînes:
Utilisation:
OriginalL'auteur pageman
Essayer dans un
<xsl:value-of>
déclaration:count(//language[contains(concat(' ',.,' '), ' java ')])
Si votre document structure est relativement statique, ou si vous avez des nœuds appelés
language
ailleurs que servir un autre but, vous pouvez remplacer//language
pour/mainNode/book/list/language
.La
concat
bits peut sembler un peu compliqué, mais en faisant en sorte il y a un espace au début et à la fin du texte, vous êtes à la recherche, et la recherche de' java '
avec un espace de chaque côté, vous n'aurez pas tort d'inclure d'autres termes, qui se comprennentjava
, commejavascript
.Si c'est possible pour "java" pour exister plus d'une fois dans un nœud, alors vous aurez besoin d'utiliser un modèle récursif. Voici un moyen:
Essentiellement, cela crée une chaîne de
0
's, un pour chaque occurrence dejava
, puis utilise simplement la longueur de cette chaîne.Si vous avez la possibilité d'utiliser XSLT 2.0, vous pouvez créer une fonction qui compte le nombre d'occurrences dans une chaîne de caractères, et l'utilisation
<xsl:value-of select="sum(mycountfunction(//language))" />
ou quelque chose de similaire.Comme je l'ai souligné dans un commentaire sur votre question, une meilleure conception de la source XML aurait contribué de manière significative; rien de cela n'est nécessaire que si chaque occurrence d'une langue a son propre élément. Bien sûr, qui peut être en dehors de votre contrôle, mais si vous avez la possibilité de modifier (ou de persuader le fournisseur pour le changer), je recommanderais fortement.
Flynn1179::: Dans la fonction ci-dessus vous avez passé de "java" comme un argument. Au lieu de "java" puis-je passer une chaîne vide " "? Comment passer la chaîne vide ou char " "?
Vous pouvez, mais ce qui serait le point dans tout cela? En passant une chaîne vide sera probablement répéter à l'infini et en le passant dans un espace vous donnera totalement dénué de sens, les résultats, étant donné que vous êtes en utilisant un espace comme séparateur.
OriginalL'auteur Flynn1179
http://www.xsltfunctions.com/xsl/functx_number-of-matches.html
J'ai répondu de la même manière ici: Trouver le nombre d'occurrences d'une sous-chaîne dans une chaîne de caractères dans xslt
OriginalL'auteur SketchBookGames