2008 13 août 2008

Tokenizing chaîne délimitée intérieur d'un XSL

Si votre exigence est de diviser une valeur dans un noeud XML, qui contient une chaîne délimitée de la valeur, en éléments individuels, alors vous avez atteint le bon endroit ... jeter un oeil à l'exemple ci-dessous. Si vous êtes familier avec un peu de XML et XSL ... Je ne pense pas que vous auriez besoin d'explication.
En outre, cet exemple inclut l'utilisation de fonctions comme XSL xsl: call-template, xsl: substring-before, xsl: substring-after, si c'est ce que vous êtes après.

XML pour être transformé (food.xml): -
Supposons que la tâche est de tokenize la chaîne délimitée par des virgules, dans les le tag "keywords"

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="food.xsl"?>
<food>
<date>July 2008</date>
<description>All about things we eat everyday</description>
<keywords>Fruits, Vegetables, Pulses, Meat, Cereals </keywords>
</food>

XSL (food.xsl): -

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>XSL 1.0 Delimited String Tokeniser</title>
</head>
<body>
<xsl:value-of select="food/meta"/>
<div >
<xsl:call-template name="tokenize">
<xsl:with-param name="string" select="food/keywords" />
<xsl:with-param name="delimitr" select="','" />
</xsl:call-template>

</div>
</body>
</html>
</xsl:template>
<xsl:template name="tokenize">
<xsl:param name="string" />
<xsl:param name="delimitr" />
<xsl:choose>
<xsl:when test="contains($string, $delimitr)">
<div style="border:1px solid red;">
<h3><xsl:value-of select="substring-before($string,$delimitr)" /></h3>
<xsl:variable name="data" select="substring-before($string,$delimitr)"/>
</div>
<xsl:call-template name="tokenize">
<xsl:with-param name="string" select="substring-after($string, $delimitr)" /><xsl:with-param name="delimitr" select="$delimitr" /></xsl:call-template>
</xsl:when>
<xsl:otherwise>
<div style="border:1px solid red;">
<h3><xsl:value-of select="$string" /></h3>
</div>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

De sortie résultant HTML: -

<div>
<div style="border: 1px solid red;">
<h3>Fruits</h3>
</div>
<div style="border: 1px solid red;">
<h3> Vegetables</h3>
</div>
<div style="border: 1px solid red;">
<h3> Pulses</h3>
</div>
<div style="border: 1px solid red;">
<h3> Meat</h3>
</div>
<div style="border: 1px solid red;">
<h3> Cereals </h3>
</div>
</div>

Inutile de dire que ... il suffit de changer le paramètre "delimitr" pour le délimiteur de votre choix


2008 4 août 2008

Un problème avec la position () dans XSL ... ou est-ce?

J'ai eu ce problème strage tout en créant un XSL aujourd'hui. Nous avons cherché des réponses à travers le net, mais nous ne pouvions trouver un .... En fait, je crois! Je sais à force quel était mon problème, alors que dois-je chercher?

Quoi qu'il en soit! Juste au cas où vous avez ce même problème aussi et en quelque sorte par la puissance de la force que vous réussi à atterrir sur cette page ... vous me remercierez ... tonnes Et si vous avez accidentellement atterri sur cette page pour un destin étrange et vous arrive d'être un développeur XSL, font une NOTE DE CE Maintenant, pour la cause de l'avenir, si un jour, vous faites face à cette question, alors la force pourrait ne pas être avec vous.

Énoncé du problème:
J'ai ce code XML, où il ya deux nœuds avec plusieurs éléments en elle et les éléments entre ces deux nœuds ont une correspondance une à une. Dans l'exemple ci-dessous, chaque élément dans le noeud <array name="PLAYURL" /> concerne (position correspondant) d'un élément dans le noeud <array name="SITENAME" />

<?xml version="1.0" encoding="utf-8"?>
<myplaylists>
<playlist>
<title>Best of Rest </title>
<array name="SITENAME">
<str>www.musicindiaonline.com</str>
<str>www.dhingana.com</str>
<str>www.raaga.com</str>
<str>www.smashits.com</str>
<str>www.desimusic.com</str>
<str>www.musicplug.in</str>
</array>
<array name="PLAYURL">
<str>http://www.musicindiaonline.com/123/</str>
<str>http://www.dhingana.com/play/123</str>
<str>http://www.raaga.com/123</str>
<str>http://ww.smashits.com/123</str>
<str>http://www.desimusic.com/123</str>
<str>http://www.musicplug.in/123</str>
</array>
</playlist>
</myplaylists>

Maintenant, j'ai une boucle, où i boucle à travers <array name="SITENAME">, et je veux obtenir le point connexe (à la position correspondante) dans <array name="PLAYURL">,

Qu'est-ce que vous essayez de faire est normalement ...

<xsl:for-each select="myplaylists/playlist/array[@name='SITENAME']/str">
play from : <a href="{../../array[@name='PLAY']/str[position()]}"/> <xsl:value-of select="." /></a>
</xsl:for-each>

DÉSOLÉ! Cela ne marchera pas ... Ah!! Surpris ...

Maintenant, vous auriez probablement eu envie d'essayer, quelque chose comme ça ...

<xsl:for-each select="myplaylists/playlist/array[@name='SITENAME']/str">
<xsl:variable name="pos"> <xsl:value-of select="position()"/></xsl:variable>
play from : <a href="{../../array[@name='PLAY']/str[$pos]}"/> <xsl:value-of select="." /></a>
</xsl:for-each>

Et Encore une fois cela ne marchera pas ... Maintenant, vous vous gratter la tête, en essayant de communiquer avec tous ceux qui vous pensez sait quelques XSL et pourrait être d'aucun secours ... vous essayez toutes les autres options ... et encore cela ne fonctionnera pas ... Eh bien! Thats ce qui m'est arrivé ... atleast

EXCLURE DÉSESPOIR! TRY THIS

<xsl:for-each select="myplaylists/playlist/array[@name='SITENAME']/str">
<xsl:variable name="pos-int" select="position()" />
play from : <a href="{../../array[@name='PLAY']/str[$
<xsl:for-each select="myplaylists/playlist/array[@name='SITENAME']/str">
<xsl:variable name="pos-int" select="position()" />
play from : <a href="{../../array[@name='PLAY']/str[$ pos-int ]}"/> <xsl:value-of select="." /></a>
</xsl:for-each>
]}"/> <xsl:value-of select="." /></a>
</xsl:for-each>

NE ME DEMANDEZ POURQUOI ÇA MARCHE. Parce que je n'ai pas de bonne raison ... si vous le faites! S'il vous plaît ne déposer un commentaire. Il pourrait être assez utile. Aussi! si vous avez un meilleur titre pour ce poste, envoyez-moi faire une ligne :)


2008 4 mai 2008

Inclure XSL XSL à l'intérieur

Si XML / XSL Transformations est votre domian, alors il ya des moments où nous voulons un peice de code dynamique pour être utilisé élément de la bibliothèque (à faire ré-utilisable). Qu'est-ce que je veux dire, sans doute pourrait être rendu plus clair avec ce scénario par exemple.

Imaginez que vous créez un site web (et en utilisant XML, XSL transfroms ofcourse) et la plupart des pages aurait un module Commentaires. Eh bien! alors soit vous copiez ou collez ce code dans tous les modèle de page (qui je n'ai pas dit, mais compliquent la maintenance et de retravailler un cauchemar) ou, mieux encore, vous créez un fichier INCLUDE qui pouvait être tirée en où que vous le voulez dans votre page ( s) ...
Alors comment créer un fichier XSL INCLUDE et l'inclure dans un autre fichier XSL? Voici comment ...

Juste pour clarifier les choses ... voici la liste rapide de fichiers que vous créez ... ici, nous allons être, y compris d'infos sur les fruits et les légumes dans une page parent appelé la nourriture.

1. food.xml - fichier de données XML sur lequel la transformation sera appliqué
2. food.xsl - fichier principal XSL, qui va transformer notre food.xml
3. inc_fruits.xsl - XSL inclure le fichier qui va rendre les données de fruits
4. inc_vegtables.xsl - XSL inclure le fichier qui va rendre les données vetetables

Je ne pense que je dois expliquer en grande partie, les codes pour les éléments ci-dessus, sera auto explicative ...

FOOD.XML


<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="food.xsl"?>
<food>
<date>July 2008</date>
<description>All about things we eat everyday</description>
<fruits type="tropical">
<item name="mango" moreinfo="http://www.mango.com">Mango is the king of fruits</item>
<item name="banana" moreinfo="http://www.banana.com">Banana once a day , keeps the doctor away</item>
<item name="orange" moreinfo="http://www.orange.com">Orange is the color and rich in vitamin C</item>
<item name="Papaya" moreinfo="http://www.papaya.com">Papaya - Hot when raw, cold when ripe</item>
</fruits>

<vegetables>
<item name="spinach" moreinfo="http://www.spinach.com">Spinach is full of iron</item>
<item name="asparagus" moreinfo="http://www.asparagus.com">Asparagus contains loads of vitamin D </item>
<item name="fenugreek" moreinfo="http://www.fenugreek.com">Fenugreek is rich in vitamin C</item>
</vegetables>
</food>


FOOD.XSL


<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="inc_fruits.xsl" />
<xsl:include href="inc_vegetables.xsl" />
<xsl:template match="/">
<html>
<head>
<title>Title</title>
</head>
<body>
<h3><xsl:value-of select="/food/description" /></h3>
Modification Date : <xsl:value-of select="/food/date" />
<hr/>
<h5> About Fruits</h5>
<xsl:call-template name="about_fruits"/>

<hr/>
<h5> About Vegetables</h5>
<xsl:call-template name="about_vegetables"/>

<hr/>
</ Body>
</ Html>
</ Xsl: template>
</ Xsl: stylesheet>


INC_FRUITS.XSL

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="iso-8859-1" />
<xsl:template name="about_fruits">
<xsl:for-each select="/food/fruits/item/@*">
attribute name : <xsl:value-of select="name()"/>
attribute value : <xsl:value-of select="."/> <br />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>


INC_VEGETABLES.XSL

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="iso-8859-1" />
<xsl:template name="about_vegetables">
<xsl:for-each select="/food/vegetables/item/@*">
attribute name : <xsl:value-of select="name()"/>
attribute value : <xsl:value-of select="."/> <br/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Télécharger tous les fichiers ci-dessus ici (250 téléchargements)


2008 4 avril 2008

Travailler avec les attributs de nœud XML avec XSLT

Si vous utilisez XML et XSL, alors vous pourriez avoir rencontré un certain temps, lorsque vous avez à jouer avec les attributs et les valeurs de nœuds XML dans XSL-vous. Ils sont des tas de sites avec des infos à propos de cette longue haleine, mais aucun que je trouvais était brève et précise ... C'est pas de tutoriel XML / XSL, mais ma tentative de mettre ensemble-une sorte de triche liste ...

L'échantillon XML que nous allons travailler avec ressemble à ceci ...

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="food.xsl"?>
<food>
<fruits type="tropical">
<item name="mango" moreinfo="http://www.mango.com">Mango is the king of fruits</item>
<item name="banana" moreinfo="http://www.banana.com">Banana once a day , keeps the doctor away</item>
<item name="orange" moreinfo="http://www.orange.com">Orange is the color and rich in vitamin C</item>
<item name="Papaya" moreinfo="http://www.papaya.com">Papaya - Hot when raw, cold when ripe</item>
</fruits>
</food>

Permet donc commencer à transformer notre XML ci-dessus en utilisant XSL

Exemple 1: Affichage de la valeur à un attribut choisi

<xsl:value-of select="/food/fruits/item[@name='orange']" /><br />
to get more information about <a href="{/food/fruits/item[@name='orange']/@moreinfo}" target="new" ><xsl:value-of select="/food/fruits/item[@name='orange']/@name" /> </a>

Résultat HTML ressemblera

Orange is the color and rich in vitamin C,
to get more information about <a href="http://www.orange.com" target="new">


Exemple 2: boucle par le biais et l'affichage de tous les noms d'attributs XML et leurs valeurs

<xsl:for-each select="/food/fruits/item/@*">
attribute name : <xsl:value-of select="name()"/>,
attribute value : <xsl:value-of select="."/> <br />
</xsl:for-each>

Résultat HTML ressemblera


attribute name : name, attribute value : mango
attribute name : moreinfo, attribute value : http://www.mango.com
attribute name : name, attribute value : banana
attribute name : moreinfo, attribute value : http://www.banana.com
attribute name : name, attribute value : orange
attribute name : moreinfo, attribute value : http://www.orange.com
attribute name : name, attribute value : Papaya
attribute name : moreinfo, attribute value : http://www.papaya.com


Télécharger tous les fichiers ci-dessus ici (243 téléchargements)



Surveillez cet espace, je vais continuer la mise à jour avec les nouveaux résultats de cette ...


NDK la maison | Exprimant IT | Bouche Exprimant | Penmenship Exprimant | Awe Exprimant | m'exprimer