2010-10-28 2 views
1

J'ai reçu un document XML dans un format assez étrange et j'ai besoin de le charger dans un DataSet, mais sans surprise, j'obtiens une erreur quand j'essaie de le faire. Je peux voir comment je pouvais transformer le document en quelque chose qui fonctionnerait, mais je vais un peu en rond avec les trucs XSLT ...Transformer XML pour qu'il puisse être lu avec DataSet.ReadXML

Le document ressemble à ceci:

<map> 
    <entry key = "status">ok</entry> 
    <entry key = "pageNum">1</entry> 
    <entry key = "title">DocTitle</entry> 
    <entry key = "stuff"> 
     <map> 
      <entry key = "id">171</entry> 
      <entry key = "name">StackOverflow</entry> 
      <entry key = "timeZone">America/New_York</entry> 
     </map> 
     <map> 
      <entry key = "id">172</entry> 
      <entry key = "name">StackOverflow2</entry> 
      <entry key = "timeZone">America/New_York</entry> 
     </map> 
    </entry> 
</map>

et Je voudrais le transformer en quelque chose comme ceci:

<map> 
    <status>ok</status> 
    <pageNum>1</pageNum> 
    <title>DocTitle</title> 
    <stuff> 
     <map> 
      <id>171</id> 
      <name>StackOverflow</name> 
      <timeZone>America/New_York</timeZone> 
     </map> 
     <map> 
      <id>172</id> 
      <name>StackOverflow2</name> 
      <timeZone>America/New_York</timeZone> 
     </map> 
    </stuff> 
</map>

J'ai tout le code en place pour l'exécuter à travers une transformation XSLT et traiter la sortie, mais je ne peux pas lui-même transformée pour produire quoi que ce soit sensible. Je ne pense vraiment pas que c'est aussi difficile que je le fais, et je serais éternellement reconnaissant si une âme sage pouvait lancer quelque chose qui fonctionnerait.

Ou peut-être me montrer juste un exemple ou quelque chose que je pouvais modifier ...

Merci.

+0

Bonne question, +1. Voir ma réponse pour une solution courte et complète. :) –

Répondre

1

Cette transformation:

<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="entry[@key]"> 
    <xsl:element name="{@key}"> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur le document XML fourni:

<map> 
    <entry key = "status">ok</entry> 
    <entry key = "pageNum">1</entry> 
    <entry key = "title">DocTitle</entry> 
    <entry key = "stuff"> 
     <map> 
      <entry key = "id">171</entry> 
      <entry key = "name">StackOverflow</entry> 
      <entry key = "timeZone">America/New_York</entry> 
     </map> 
     <map> 
      <entry key = "id">172</entry> 
      <entry key = "name">StackOverflow2</entry> 
      <entry key = "timeZone">America/New_York</entry> 
     </map> 
    </entry> 
</map> 

produit le résultat souhaité, correct:

<map> 
    <status>ok</status> 
    <pageNum>1</pageNum> 
    <title>DocTitle</title> 
    <stuff> 
     <map> 
      <id>171</id> 
      <name>StackOverflow</name> 
      <timeZone>America/New_York</timeZone> 
     </map> 
     <map> 
      <id>172</id> 
      <name>StackOverflow2</name> 
      <timeZone>America/New_York</timeZone> 
     </map> 
    </stuff> 
</map> 
+0

Wow! C'est exactement ce dont j'avais besoin - et une réponse rapide aussi! – Miszou

+0

@Miszou: Content que cette solution soit utile. À SO, le moyen d'exprimer sa gratitude est d'accepter et d'upvoter la réponse. :) –

+0

+1 Bonne réponse. –

0
<xsl:stylesheet 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
    exclude-result-prefixes="xs"> 

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

<xsl:template match="//entry"> 
     <xsl:variable name="key" select="@key"/> 
     <xsl:element name="{$key}"> 
       <xsl:apply-templates/> 
     </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

utiliser le code de balisage. L'opérateur '//' de départ n'est pas nécessaire dans les modèles. –

+0

Pourquoi XSLT 2.0? Aucune fonctionnalité XSLT 2.0 uniquement n'est utilisée dans votre solution. Dans tous ces cas, il est bon d'exprimer la solution sous XSLT 1.0 de sorte qu'il est clair que la majorité des lecteurs peuvent l'utiliser. –

Questions connexes