Aller au contenu


[XSLT] travailler sur du xml imbriqué et échappé


  • Please log in to reply
4 réponses à ce sujet

#1 Dude76

Dude76

    NightMist

  • Members
  • PipPipPipPip
  • 910 messages

Posté 15 juin 2011 - 19:13

Un petit exemple allant mieux que des mots...
J'ai un truc comme ça en entrée :
<MyDataSet>
  <MyTable1>
	<MyRow>
  	<MyXmlAsString>&lt;balise&gt;blablabla xml échappé&lt;/balise&gt;</MyXmlAsString>
	</MyRow>
  </MyTable1>
</MyDataSet>
J'ai un fichier xsl pour ma transformation; À l'origine, il devait transformer le contenu de plusieurs tables, mais vu les problèmes de perfs (pas de possibilité actuellement d'avoir de relation entre les tables...), j'ai du me rabattre sur de la génération du xml directement depuis Sql Server.
Il le fait vite et bien.
Le problème, c'est que via une procédure et un chargement dans un dataset, il ne prend pas le type xml mais nvarchar(max).
Ensuite, au moment où on veut appliquer une transformation sur le XmlDataDocument (un dataset xml), il va fournir la version xml du dataset (normal hein), mais dedans mon nvarchar(max) se trouve échappé.
Problème supplémentaire, le xml-nvarcharé est une version sans aucun espace entre les balises (pas de retour ligne, pas d'indentation).
(si jamais y'a moyen, je suis déjà preneur, mais bon, j'y crois pas).
Pour l'instant, j'ai réussi à recracher tel quel le nvarchar déséchappé grâce à <xsl:value-of select="" disable-output-escaping="yes" />(il le déséchappe tout seul).
Dans l'idéal, je voudrais pouvoir "xmliser" le nvarchar et pouvoir le parcourir afin d'effectuer de le réindenter*.
Pour l'instant, je sais/vois pas du tout comment faire.
Vous avez des idées/solutions à me proposer ?

* : je sais, ça peut paraître stupide comme ça, mais essayer d'ouvrir un xml tout en 1 seule ligne de plus de 10Mo, vous verrez que nos éditeurs aiment pas ça.
Pis après tout, le fait de pouvoir retravailler sur un xml échappé imbriqué, ça peut toujours être utile, non ? :p
I am. I was not then I came to be. I cannot remember NOT being. But I may have traveled far, very far, to get here.
Image IPB

#2 DEF

DEF

    DTC !

  • Administrators
  • 2 379 messages
  • LocationLyon

Posté 15 juin 2011 - 19:37

Là, j'avoue, je ne vois pas comment faire ça avec une transformation xslt.
J'ai tellement de mauvais souvenirs de ce genre de choses, que je n'ose pas m'y replonger.

Et passer d'abord ta chaîne dans un script qui te reconstruit ton xml, non? Ou, je dis une connerie?
En plus, si tu as des caractères "<" ou ">" dans tes valeurs xml, c'est le bordel  :lol:.

#3 Dude76

Dude76

    NightMist

  • Members
  • PipPipPipPip
  • 910 messages

Posté 15 juin 2011 - 19:51

Oui mais non, le xml "hébergé" est forcément bon, puisque c'est un xml mais échappé.
Sinon, pour le script, ben ... le xslt ! :p
Ah si seulement cet abruti de SQL Server conservait le type xml quand on charge des données dans un datatable !:(
I am. I was not then I came to be. I cannot remember NOT being. But I may have traveled far, very far, to get here.
Image IPB

#4 Dude76

Dude76

    NightMist

  • Members
  • PipPipPipPip
  • 910 messages

Posté 15 juin 2011 - 20:34

Je me demande s'il n'est pas possible de faire un truc du genre:
<xsl:param name="data"><xsl:value-of select="/MyDataSet/MyTable1/MyRow/MyXmlAsString" disable-output-escaping="yes"/></xsl:param>
<xsl:for-each select="$data">
  <xsl:apply-template match="."/>
</xsl:for-each>
<!-- template identité -->
<xsl:template match="@*|node()">
  <xsl:copy>
	<xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

Un avis ?
I am. I was not then I came to be. I cannot remember NOT being. But I may have traveled far, very far, to get here.
Image IPB

#5 DEF

DEF

    DTC !

  • Administrators
  • 2 379 messages
  • LocationLyon

Posté 15 juin 2011 - 21:07

Alors là, il va falloir que je me replonge dans xslt avant de répondre :desole:


1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)