2010-10-20 16 views
1

J'ai appris sur XSLT et XPath à w3schools, mais ce n'est pas exactement ce que je voulais .. Il n'y a que des exemples de transformation de XSLT 2 HTML, c'est assez simple, mais j'ai besoin d'une transformation XML XML 2 et ne peut pas trouver un bon tutoriel avec des exemples ... J'ai téléchargé MSXSL.exe, mais ne trouve pas d'exemples sur son utilisation pour transformer XML ... Quelqu'un peut-il écrire un échantillon? Je Customers.xml aime:XML 2 XML utilisant XSLT

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<!--Customers table from Northwind database--> 
<Customers> 
    <Customer CustomerID="ALFKI"> 
    <CompanyName>Alfreds Futterkiste</CompanyName> 
    <Country>Germany</Country> 
    <Orders> 
     <Order OrderID="10643"> 
     <ShipCity>Berlin</ShipCity> 
     </Order> 
     <Order OrderID="10692"> 
     <ShipCity>Berlin</ShipCity> 
     </Order> 
     <Order OrderID="10702"> 
     <ShipCity>Berlin</ShipCity> 
     </Order> 
     <Order OrderID="10835"> 
     <ShipCity>Berlin</ShipCity> 
     </Order> 
     <Order OrderID="10952"> 
     <ShipCity>Berlin</ShipCity> 
     </Order> 
     <Order OrderID="11011"> 
     <ShipCity>Berlin</ShipCity> 
     </Order> 
    </Orders> 
    </Customer> 
    <Customer CustomerID="ANATR"> 
    <CompanyName>Ana Trujillo Emparedados y helados</CompanyName> 
    <Country>Mexico</Country> 
    <Orders> 
     <Order OrderID="10308"> 
     <ShipCity>México D.F.</ShipCity> 
     </Order> 
     <Order OrderID="10625"> 
     <ShipCity>México D.F.</ShipCity> 
     </Order> 
     <Order OrderID="10759"> 
     <ShipCity>México D.F.</ShipCity> 
     </Order> 
     <Order OrderID="10926"> 
     <ShipCity>México D.F.</ShipCity> 
     </Order> 
    </Orders> 
    </Customer> 
</Customers> 

Et essayer de générer un autre XML qui ne contient que des nœuds « pays » .. Comment écrire?

+0

Bonne question, +1. Voir ma réponse pour deux solutions. :) –

Répondre

1

Voici deux solutions différentes: simple et plus compliquée qui ne produit que les pays uniques:

.1. Obtenez tous Country éléments:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[not(self::Country)]"> 
    <xsl:apply-templates select="*"/> 
</xsl:template> 
</xsl:stylesheet> 

lorsque cette transformation est appliquée sur le document XML fourni, le voulait, résultat correct est produit:

<Country>Germany</Country> 
<Country>Mexico</Country> 

.2. Trouver tous les pays uniques:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:key name="kCountryByVal" match="Country" use="."/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
     "/*/*/Country[generate-id() 
        = 
        generate-id(key('kCountryByVal',.)[1]) 
        ] 
     "/> 
</xsl:template> 
</xsl:stylesheet> 

lorsque cette transformation est appliquée sur tout document XML avec la structure du document fourni où certains éléments Country peuvent avoir la même valeur, un seul élément Country pour chaque valeur différente est produit.

Le document XML fourni, nous obtenons toujours le même résultat:

<Country>Germany</Country> 
<Country>Mexico</Country> 
3

C'est exactement la même chose, il vous suffit d'utiliser l'attribut method de l'élément output en conséquence.

+1

+1, exemples ici: http://www.w3schools.com/xsl/el_output.asp – Bruno

3

Quelque chose comme cela devrait fonctionner ...

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
    <Countries> 
     <xsl:apply-templates select="//Country" mode="copyNode" /> 
    </Countries> 
    </xsl:template> 

    <xsl:template match="@* | node()" mode="copyNode"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()" mode="copyNode"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

... Voici le résultat ...

<?xml version="1.0" encoding="utf-8"?> 
<Countries> 
    <Country>Germany</Country> 
    <Country>Mexico</Country> 
</Countries> 
+0

Devinez Je n'ai pas besoin de l'espace de noms Microsoft si je ne l'utilise pas. –

+0

Je devrais probablement ajouter cela inclura tous les noeuds enfants des éléments '' s'ils existaient. –

1

Son assez simple, il vous suffit d'écrire xml au lieu de html à l'intérieur de vos modèles xslt.

ci-dessous (non testé) devrait vous aider à démarrer:

<xsl:template match="/"> 
    <Countries> 
    <xsl:apply-templates select="Customers/Customer" /> 
    </Countries> 
</xsl:template> 

<xsl:template match="Customer"> 
    <Country> 
    <xsl:value-of select="Country" /> 
    </Country> 
</xsl:template> 

En outre, pour un processeur XSLT, je recommande vivement Visual Studio - il a un excellent débogueur XSLT qui vous aider sans fin dans la compréhension de vos feuilles de style . (Je ne sais pas si cette fonctionnalité est incluse dans les éditions express ...)

0

Dans le style de traction, ce qui devrait être la plus courte stylesheet exprimant cette transformation:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="text()"/> 
    <xsl:template match="@*|/*|Country|Country/text()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Sortie:

<Customers> 
    <Country>Germany</Country> 
    <Country>Mexico</Country> 
</Customers>