Question

J'ai une question sur une sorte fonction af aléatoire dans XSLT.

J'ai un fichier XML qui semblent très simplifié semblable à ceci:

<node id="1198">
  <node id="1201">
    <data alias="name">Flemming</data>
    <data alias="picture">1200</data>
  </node>
  <node id="1207">
    <data alias="name">John</data>
    <data alias="picture">1205</data>
  </node>
  <node id="1208">
    <data alias="name">Michael</data>
    <data alias="picture">1206</data>
  </node>
</node>

Je voudrais avoir une certaine XSLT, que ramdomly a l'un des noeuds id et le mettre dans une variable appelée « choosenNode ». Comme cela, si le nœud avec l'ID de 1207 a été sélectionné parmi:

<xsl:variable name="choosenNode" value="1207" />

Comment puis-je faire cela? Y at-il une fonction aléatoire dans XSLT? Soit dit en passant, je voudrais la variable à rafraîchir sur chaque page où le XSLT est inclus.

Et je travaille dans Umbraco CMS, si cela vous aide les gars.

Merci, -Kim

Était-ce utile?

La solution

Dans Umbraco vous pouvez faire quelque chose comme ceci:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:Stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]>
<xsl:stylesheet 
version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxml="urn:schemas-microsoft-com:xslt"
xmlns:umbraco.library="urn:umbraco.library"
xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath"
exclude-result-prefixes="msxml umbraco.library Exslt.ExsltMath">

<xsl:output method="xml" omit-xml-declaration="yes"/>

<xsl:param name="currentPage"/>

<!-- This should probably be a macro parameter so you can use this elsewhere-->
<xsl:variable name="parentNode" select="1048"/>

<xsl:template match="/">

        <xsl:variable name="numberOfNodes" select="count(umbraco.library:GetXmlNodeById($parentNode)/node)"/>

        <xsl:variable name="randomPosition" select="floor(Exslt.ExsltMath:random() * $numberOfNodes) + 1"/>

        <xsl:variable name="randomNode" select="umbraco.library:GetXmlNodeById($parentNode)/node [position() = $randomPosition]"/>

        <!--
          You now have the node in the $randomNode variable
          If you just want the id then you can do an XPath query on the variable
          or you can modify the XPath above to get the property you are after rather than
          the whole node
        -->

    <xsl:value-of select="$randomNode/@nodeName" />

</xsl:template>
</xsl:stylesheet>

Hope this helps.

Tim

Autres conseils

Obtenir nombre aléatoire dans xslt est pas une tâche facile.

Il y a quelque chose qui peut le faire, mais vous a sans doute de fournir des semences pour le générateur aléatoire http://fxsl.sourceforge.net/ articles / aléatoire / Castings% 20Le% 20Dice% 20with% 20FXSL-htm.htm

Peut-être que le processeur que vous utilisez pour faire la transformation xsl a la capacité d'étendre les expressions xsl avec des fonctions externes. Dans ce cas, vous pouvez peut-être utiliser en dehors fonction aléatoire.

Tout ce que vous avez besoin est un générateur de nombres aléatoires. Il n'y a pas dans XSLT ainsi le nombre aléatoire doit être fourni par quelque chose en dehors de XSLT. Vous aurez besoin d'appeler une méthode à partir d'une bibliothèque externe pour le faire et cette bibliothèque Application de l'dépendra si vous êtes sous Windows (.NET ou WIN32) ou Linux et le processeur XSLT. XSLT peut faire des mathématiques, mais il manque beaucoup de fonctions liées à la date / heure qui arrive à comprendre un générateur de nombres aléatoires.

Cependant, XSLT a une fonction XPath appelée générer-id () qui va générer un identifiant unique. Si vous pouviez transformer à un nuimber en quelque sorte, il peut être utilisé pour créer un nombre aléatoire, bien qu'il serait prévisible et quelques chiffres pourrait se produire plus souvent que d'autres. je ne voudrais pas l'utiliser.

Si vous utilisez msxsl pour traiter votre feuille de style, vous pouvez inclure JavaScript afin de générer des nombres aléatoires dans la feuille de style. (Ou C # Le script lors de l'utilisation .NET.)

Obtenir le nœud lui-même est facile, une fois que vous connaissez le nombre de nœuds enfants. Il suffit de demander le nœud à la position aléatoire. Quelque chose comme / nœud / nœud [5] renvoie le 5ème noeud.

Cette solution fonctionne dans un script shell qui utilise des utilitaires xsltproc et texte.

RandomElement=$(xsltproc style.xsl file.xml | tr ' ' '\n' | sort -uR | head -n 1)

Il est supposé que le fichier style.xsl sélectionnera l'élément nécessaire régler et retourner ses valeurs, une par ligne dans le fichier texte de sortie. La commande tr doit mettre chaque élément sur une ligne séparée. Le sort -uR devrait produire une liste aléatoire unique, des éléments choisis par les commandes de feuille de style style.xsl. Le head -n 1 tire alors la première ligne de la liste aléatoire et unique.

Ce qui suit suppose que le processeur XSLT supporte les extensions EXSLT (par exemple, xsltproc).

Ceci renvoie le contenu du hasard sélectionné « noeud » (élément, il doit être un enfant d'un « nœud », à savoir un « noeud / nœud »).

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:math="http://exslt.org/math"
  extension-element-prefixes="math" >

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="node">
  <xsl:variable name='selected'>
    <xsl:value-of select="ceiling(math:random() * count(node))"/>
  </xsl:variable>
  <xsl:copy-of select="node[position() = $selected]"/>
</xsl:template>
</xsl:stylesheet>

Cela peut être un extrait utile pour traiter le contenu du noeud sélectionné:

<xsl:variable name="randomNode" select="node[position() = $selectNode]"/>
<id><xsl:value-of select="$randomNode/@id"/></id>
<name><xsl:value-of select="$randomNode/data[@alias='name']"/></name>
<picture><xsl:value-of select="$randomNode/data[@alias='picture']"/></picture>

Notez que le ne revient pas au-dessus de la définition de xslt de la variable, il utilise cette variable pour copier le nœud sélectionné.

Pour définir l'attribut « valeur » d'un xsl: élément variable, essayez un modèle d'attribut comme:

<xsl:variable name='chosenNode' value='{node[position() = $selected]/@id}'/>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top