2017-10-21 63 views
0

J'ai un processus XSLT 2 ou 3 en cours de traitement où je passe une chaîne de mots unique en tant que paramètre dans le modèle XSL. Pour cette tâche je passe un nom de famille qui est utilisé pour trouver tous les éléments <person> dans plusieurs documents XML où c'est l'enfant <nL>, nom en dernier, l'élément correspond au paramètre que j'ai passé. Cela fonctionne mais je voudrais modifier mon expression XPATH pour pouvoir passer un paramètre séparé par une virgule. Par exemple, je peux maintenant passer le nom de famille = "Johnson" mais voudrait pouvoir passer le nom = "Johnson, Johnston"Comment faire correspondre des valeurs dans une variable dans un prédicat dans XPATH

J'utilise le dernier processeur de Saxon dans Java. J'invoque la transformation avec

java net.sf.saxon.Transform -s:all-sources.xml -xsl:xsl/index-person-param.xsl surname="Johnson"

tout-sources.xml est une liste XML formated d'autres fichiers XML.

Je n'inclurai qu'une petite partie de mon code à moins d'en avoir besoin. C'est probablement un problème XPATH simple que je ne comprends tout simplement pas.

Actuellement avant mon template match j'ai cette déclaration de paramètres

<xsl:param name="surname" as="xs:string" required="yes"/>

je trouve tous les <person> éléments correspondant à la variable suivante

<xsl:variable name="nameMatch" select="document(/files/file/@filename)//person[nL = $surname]"/>

Cela fonctionne lorsque le nom de $ variable est une chaîne d'un mot. Comment pourrais-je modifier le prédicat ci-dessus afin que $ nom puisse contenir deux ou plusieurs mots séparés par une virgule?

J'ai essayé plusieurs modifications en utilisant tokenize() et mais je n'ai toujours pas trouvé de solution de travail. Merci, Michael

+1

Avez-vous essayé l'une de ces: https://stackoverflow.com/questions/6357166/how-to-compare-against-multiple-strings-in-xslt – Lesiak

+0

J'ai cherché dans le fil que vous avez fourni et trouvé une solution. J'ai changé le document 'select =" (/ files/file/@ nom de fichier) // person [nL = $ nom de famille] "' 'select =" document (/ files/file/@ nom de fichier) // person [correspond (nL, $ patronyme)] "' qui me donne le résultat désiré. Merci beaucoup pour l'aide – Sawtooth67

Répondre

2

Si vous gardez <xsl:param name="surnames" as="xs:string" required="yes"/> puis utilisez tokenize pour créer une séquence de chaînes avec par exemple <xsl:param name="surname-seq" as="xs:string*" select="tokenize($surnames, '\s*,\s*')"/>, puis comparez nL = $surname-seq.

Ou de modifier le paramètre pour qu'il s'agisse d'une séquence de chaînes avec, par ex. <xsl:param name="surname" as="xs:string*" required="yes"/>, puis, sur la ligne de commande, vous devez vous assurer que vous utilisez par ex. ?surname="'foo','bar'". Vous devrez tester quelles combinaisons de guillemets fonctionnent, le point d'interrogation ?surname indique que la valeur est une expression XPath, il dépend alors de l'interpréteur de commande que vous utilisez ce dont vous avez besoin pour vous assurer que vous passez une expression complète à Saxon.

+0

Martin, en plus de la solution que j'ai trouvé dans le fil Lesiak fourni, j'ai testé votre première suggestion et obtenu la solution de travail et souhaitée aussi. Merci encore d'avoir pris le temps d'enseigner. -Michael – Sawtooth67