J'ai un ensemble de données existant qui utilise un entier pour stocker plusieurs valeurs; L'extrémité avant legacy a fait un contrôle simple du bitwise (par exemple en C #: Itivalues & 16 == 16) pour voir si une valeur particulière a été définie. Est-il possible de faire des opérations bitwises en XSL, et de manière plus explicite, de faire des comparaisons de niveau de bits via le masquage? L'intégré "et" entraînera toujours "vrai" ou "faux", mais peut-être qu'il est possible via les opérateurs de mathématiques disponibles? P>
J'utilise actuellement .NET 2.0, qui utilise XSLT 1.0. P>
4 Réponses :
xslt est Turing-complète , voir par exemple ici ou Voici , donc cela peut être fait. Mais je n'ai utilisé que xslt un ou deux fois et ne peut donner aucune solution.
update strong> p> Je viens de lire un tutoriel à nouveau et j'ai trouvé une solution à l'aide du fait suivant. bitset (x, n) code> renvoie true, si le
n code> -e bit de
x code> est défini, faux sinon. p>
Number | Bit 3 | Bit 2 | Bit 1 | Bit 0
---------------------------------------
0 | 0 | 0 | 0 | 0
1 | 0 | 0 | 0 | 1
2 | 0 | 0 | 1 | 0
3 | 0 | 0 | 1 | 1
4 | 0 | 1 | 0 | 0
5 | 0 | 1 | 0 | 1
6 | 0 | 1 | 1 | 0
7 | 0 | 1 | 1 | 1
8 | 1 | 0 | 0 | 0
9 | 1 | 0 | 0 | 1
10 | 1 | 0 | 1 | 0
11 | 1 | 0 | 1 | 1
12 | 1 | 1 | 0 | 0
13 | 1 | 1 | 0 | 1
14 | 1 | 1 | 1 | 0
15 | 1 | 1 | 1 | 1
Comment est-ce que la réponse complète de Turing-complète la réponse si il existe des opérateurs à deux opérateurs?
S'il s'agit de Turing-complet, il peut calculer toutes les fonctions, d'où les opérations sur les entiers.
Hmm ... je ne comprends pas. Je connais la notion de complétude de Turing, mais je peux toujours imaginer une langue qui est complète et n'a pas d'opérateurs bit-wise, c'est-à-dire qu'il n'y a aucun moyen de diviser les nombres en petits morceaux.
Il n'y a pas besoin d'opérations biteux - vous pouvez les imiter. Prenez un certain nombre de variables (peut-être 32), les initialisez-les avec zéro et pensez-les comme une matrice. Prenez une autre variable X qui contient votre valeur d'entrée. Regardez la variable la plus à droite. Est-ce zéro? Réglez-le à un. Est-ce un? Allez de droit à gauche à gauche dans le tableau et réglez-les sur des zéros jusqu'à ce que vous trouviez le premier zéro. Définissez ceci sur un. Maintenant, soustrayez-en un de x et tout interarez jusqu'à zéro. Lorsque vous atteignez zéro, la matrice contiendra la représentation binaire de X.
Tous terminés avec la définition d'une variable à deux symboles abriaraires 'zéro' et «un», comparant une variable avec un symbole, soustrayez 1 à partir d'une variable, un peu de branchement et une sorte d'accès indirect. Et cela reste beaucoup plus que nécessaire - vous pouvez résoudre ce problème avec beaucoup moins, vous n'avez pas besoin de soustraction, par exemple. C'est donc ce que Turing Taying est à propos - vous pouvez faire exactement la même chose sur chaque système complet de Turing.
J'ai écrit une fois mon propre débogueur de la ligne d'assembleur Barebones sur un mainframe. Comme vous le décrivez, commencez avec 16 mots premiers pour imiter mes registres. Cela a bien fonctionné, sauf quand il a frappé les appels SVC :)
Je n'ai rien vu de tel dans XSLT / XPATH. Mais j'ai trouvé Quelqu'un met en œuvre ce type d'opérations manuellement . Peut-être que vous pourriez utiliser la même approche, si vous avez vraiment besoin de. P>
Belle trouvaille; Il suffit de changer le modèle nommé pour accepter le numéro en tant que paramètre et cela a fonctionné comme un champion pour une valeur arbitraire.
XSLT ne définit pas les opérations binaire. Si vous le souhaitez, vous devez rouler votre propre.
Si vous utilisez XSLT spécifiquement dans le contexte .NET 2.0 - c'est-à-dire XSLCompiledTransform code> classe - alors la solution la plus simple consiste à utiliser un script Bloquer pour introduire une fonction C # qui le fait, puis appelez-le simplement que: p> ou vous pouvez définir les primitives de haut niveau dans un bloc de script, tel que Lors du chargement d'une telle feuille de style, vous devez activer explicitement le script de celui-ci: P> HASFLAG code>, puis utilisez celles-ci. P>
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("foo.xsl",
new XsltSettings { EnableScript = true },
new XmlUrlResolver());
<xsl:value-of select="for $n in (128, 64, 32, 16, 8, 4, 2, 1) return if ((floor($var div $n) mod 2) = 1) then 1 else 0"/> this will return the binary array of your variable (stored in $var)by the way I used XPath 2.0 to do this
Merci mais non applicable à .NET Framework (selon la question originale, qui est toujours le cas pour .NET 4.0). Votre solution ne fonctionne que si vous utilisez une bibliothèque 3ème partie avec prise en charge de XPath 2.0.