XML CSV à l'aide de XSLT
Je suis à la recherche d'un être intelligent, efficace XSLT qui ne convertir un document XML au format CSV des données. Il doit prendre soin de tous les éléments possibles dans les nœuds enfants.
Par exemple, le XML ressemble à ceci
<?xml version="1.0" encoding="ISO-8859-1"?>
<sObjects>
<sObject>
<Name>Raagu</Name>
<BillingStreet>Hoskote</BillingStreet>
</sObject>
<sObject>
<Name>Rajath</Name>
<BillingStreet>BTM</BillingStreet>
<age>25</age>
</sObject>
<sObject>
<Name>Sarath</Name>
<BillingStreet>Murgesh</BillingStreet>
<location>Bangalore</location>
</sObject>
</sObjects>
Et ma sortie CSV devrait ressembler à ceci
Name,BillingStreet,age,location
Raagu,Hoskote,,
Rajath,BTM,25,
Sarath,Murgesh,,Bangalore
Toutes les lignes doivent avoir des champs pour toutes les touches dans le CSV, même si le XML n'ont de valeur pour lui.
Qui suit est le code XSLT m'est venu en regardant les différents exemples ici.
C'est le XSLT je viens avec le
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="delimiter" select="','"/>
<xsl:key name="field" match="sObject/*" use="name()"/>
<xsl:template match="/">
<xsl:for-each select="/*/*/*[generate-id()=generate-id(key('field', name())[1])]">
<xsl:value-of select="name()"/>
<xsl:if test="position() != last()">
<xsl:value-of select="$delimiter"/>
</xsl:if>
</xsl:for-each>
<xsl:text>
</xsl:text>
<xsl:for-each select="/*/sObject">
<xsl:variable name="property" select="." />
<xsl:for-each select="$property/*">
<xsl:variable name="value" select="." />
<xsl:value-of select="$value"/>
<xsl:if test="position() != last()">
<xsl:value-of select="$delimiter"/>
</xsl:if>
<xsl:if test="position() = last()">
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
et imprimer ce mettre
Name,BillingStreet,age,location
Raagu,Hoskote
Rajath,BTM,25
Sarath,Murgesh,Bangalore
Mais je voulais toutes les lignes doivent contenir des valeurs pour ces nombreuses fois pour toutes les clés sur la première ligne.
Pourriez-vous svp m'aider à réaliser cela en utilisant le code XSLT ?
- Nous allons l'aider. Lorsque vous êtes coincé. Essayez quelque chose, et à vous demander si quelque chose n'est pas clair. FAQ
- Double Possible de plusieurs questions similaires. Voir les liens sous "Liées".
- Grâce ppeterka. Depuis, je suis nouveau sur XSLT, j'ai essayé différentes choses sur XSLT pour obtenir ce fait. J'ai écrit échantillon de code XSL pour obtenir la première ligne (toutes les touches)mais de ne pas avoir de logique pour obtenir les valeurs avec les positions appropriées. J'ai vu au sujet des liens et n'a pas trouvé de solution à mon problème. Je suis coincé à ce point maintenant et ont besoin d'aide genre de Stackoverflow maintenant.
- Montre nous ce que vous avez essayé, de sorte que nous pouvons comprendre ce que vous rencontrez des problèmes avec
- Aussi, pouvez-vous utiliser XSLT2.0?
- Ma condition, c'est de faire ce travail en XSLT 1.0.
Vous devez vous connecter pour publier un commentaire.
Comment à ce sujet pour une solution en deux étapes
L'astuce ici est que la
allFields
variable contiendra un élément de chaque nom, il est donc ce liste de nœuds que nous itérer sur chaque ligne, pas simplement les éléments qui existent réellement dans la ligne. Puisque vous dites que vous voulez à l'appui de XML arbitraire des espaces de noms etc. J'ai utilisé des modèles comme/*/*/*
plutôt que de coder en dur de tout élément particulier (les noms/*/*/*
simplement correspond à tout élément qui est un petit-enfant de l'élément de document, indépendamment de noms d'élément), et je suis en utilisantlocal-name()
au lieu dename()
ignorer les préfixes d'espace de noms (cela le traiter<sObject>
,<sObject xmlns="foo">
et<f:sObject xmlns:f="foo">
exactement le même).