0
votes

Comment confirmer qu'une séquence de chaîne est un sous-ensemble d'un autre?

Je ne sais pas comment déterminer si un ensemble de chaînes (xs: chaîne *) est un sous-ensemble d'un ensemble de cordes de référence.

J'ai supposé que les opérations de noeuds fonctionnent avec XS: String *, mais ils fonctionnent avec le nœud type (), pas XS: chaîne. J'ai essayé aussi de la fonction () plus simple (), ce qui ne fonctionne pas uniquement sur des chaînes simples, pas des séquences de chaînes. xxx

i obtenir ceci:

erreur : Type d'élément requis de la trieuse de commande de document est noeud (); Valeur fournie a le type d'élément XS: chaîne


1 commentaires

Vous devez être un peu plus précis sur l'exigence. Est (A, B) un sous-ensemble de (A, B, C)? Qu'en est-il (A, C) ou (A, A, B) ou (C, B, A)? C'est un peu déroutant que vous parlez de séquences et de sous-ensembles plutôt que des séquences / des sous-séquences ou des ensembles / sous-ensembles.


3 Réponses :


0
votes

Si vous utilisez (XPath 2 et version ultérieure) Chaque $ S dans $ test satisfait $ S = $ autorisé alors je pense que votre chèque devrait fonctionner pour des séquences de valeurs atomiques telles que des chaînes.

comme alternative: compte ($ test) = compte ($ test [. = $ autorisé])


2 commentaires

J'ai trouvé des informations sur les "expressions quantifiées" comme celles-ci. Je vais regarder en eux maintenant. Merci.


Martin et @Matthewfarabaugaugh: Ces deux expressions ont O (m * n) complexité du temps. Il existe une solution uniquement de O (n) la complexité de temps.



1
votes

Utilisez strong>: xxx pré>

Vérification basée sur XSLT: strong> p>

true false


6 commentaires

Merci pour la réponse supplémentaire. Ceci est certainement moins évident syntaxiquement que ce que @Martin Honnen a suggéré. Y a-t-il des avantages de performance?


@Matthewfarabaugh: Comme indiqué, il s'agit plus de général - il peut être utilisé dans XPath 1.0 aussi. En outre, c'est l'une des lois les plus générales de la logique - et est à la fois fondamentale et évidente - toute déclaration est la négation de sa négation. Les programmeurs JavaScript utilisent ceci comme modèle de code commun de convertir toute valeur en boolean en double-nier: !! x et c'est certainement plus que deux fois plus court que les deux expressions que les deux expressions fournies dans les deux. réponse. Beaucoup de gens apprécieront cette solution comme je le fais vraiment :)


@Matthewfarabaugaugh En ce qui concerne les avantages de la performance, je pense que les 3 expressions proposées ont la même complexité de la période: o (m * n) car toutes les paires d'articles possibles des deux ensembles doivent être envisagées pour (dans) l'égalité. Une solution O (n) est possible si une carte XPath 3.1 est construite à l'avance (globalement / une fois), car la vérification si un élément est une clé dans une carte doit être proche du temps constant.


@Matthewfarabaugaugh J'ai mis à jour la réponse - Regardez à la fin - et cela inclut désormais la solution la plus rapide avec seulement une complexité de temps O (n) à l'aide de cartes. Toujours basé sur la loi fondamentale de la logique ... :) Profitez!


C'est beaucoup d'informations excellentes. Merci. Supposons que je voulais implémenter une solution de carte sur un paramètre de chaîne passée dans la feuille de style. Je le briserais probablement avec une tokenize (). Comment ferais-je une carte de ce genre? Ou y a-t-il un moyen de passer une carte dans une feuille de style? S'il vous plaît laissez-moi savoir si cela est mieux laissé à un thread de question distinct. Merci.


@Matthewfarabaugaugh, oui, on peut passer un paramètre de chaîne à la transformation, puis obtenir une séquence de ses substrings et créer une carte à partir de ceci. Si vous demandez cela comme une question séparée, veuillez m'informer via un commentaire. Ma réponse est-elle plus ou moins utile que celle actuellement acepplée?



0
votes

Définir les opérations ne fonctionne pas sur les cordes, mais les opérations de séquence font. Votre tentative:

<xsl:if test="deep-equal(distinct-values(($permitted, $test)), $permitted)">


1 commentaires

La déclaration "Les opérations définies ne fonctionnent pas sur les chaînes, mais les opérations de séquence" ont besoin de clarification - il est vrai pour Node-Setts - non pour aucun ensemble. Il est possible de mettre en place un ensemble de chaînes - oui, réel ensemble où il n'y a pas de commande - avec xpath 3.1 cartes. Cette solution peut également être le plus rapide - O (N) vs. O (m * n)