2008-10-16 5 views
4

Je vois ce message d'exception provenant de XslCompiledTransform.Transform(), mais après avoir géré l'exception, la transformation XSL semble toujours avoir réussi. Le message complet d'exception est:"Texte de jeton dans l'état EndRootElement entraînerait un document XML non valide"

texte Token dans l'état EndRootElement se traduirait par un document XML non valide. Assurez-vous que le paramètre ConformanceLevel est défini sur ConformanceLevel.Fragment ou ConformanceLevel.Auto si vous souhaitez écrire un fragment XML.

La feuille de style ressemble à ceci:

<xsl:stylesheet version="1.0" xmlns:ext="ext:extensions" xmlns:f="http://schemas.foo.com/FOAMSchema"> 
    <xsl:template match="/Root/Documents/PO/DROPSHIP"> 
    <Transactions> 
     <Transaction> 
     <f:partnerTransmission> 
      <transmission_id> 
      <xsl:value-of select="ext:NewGUID()"/> 
      </transmission_id> 
      <partner_code> 
      <xsl:value-of select="/Root/@PartnerCode"/> 
      </partner_code> 
      <control_nbr> 
      <xsl:value-of select="@GS_CNTRL_NUM"/> 
      </control_nbr> 
      <creationTime> 
      <xsl:value-of select="ext:ConvertToStandardDateTime(@DATE,@TIME,'ISO8601Basic')"/> 
      </creationTime> 
      <direction>I</direction> 
      <messageCount> 
      <xsl:value-of select="count(ORDERS/ORDER)"/> 
      </messageCount> 
      <syntax>XML</syntax> 
      <format>BARBAZ</format> 
      <deliveryMethod>FTP</deliveryMethod> 
     </f:partnerTransmission> 
     </Transaction> 
    </Transactions> 
    </xsl:template> 
</xsl:stylesheet> 

Le XML généré ressemble à ceci:

<Transactions xmlns="http://schemas.foo.com/IntegrationProfile" xmlns:ext="ext:extensions"> 
    <Transaction> 
    <f:partnerTransmission xmlns:f="http://schemas.foo.com/FOAMSchema"> 
     <transmission_id>a5e0ec76-6c24-426b-9eb5-aef9c45d913f</transmission_id> 
     <partner_code>VN000033</partner_code> 
     <control_nbr>650</control_nbr> 
     <creationTime>9/27/2008 12:51:00 AM</creationTime> 
     <direction>I</direction> 
     <messageCount>2</messageCount> 
     <syntax>XML</syntax> 
     <format>BARBAZ</format> 
     <deliveryMethod>FTP</deliveryMethod> 
    </f:partnerTransmission> 
    </Transaction> 
</Transactions> 

Ce qui précède est ce que je reçois quand je surprends et ignorer l'exception.

Je n'ai pas réussi à trouver un moyen de définir ConformanceLevel (la propriété est en lecture seule), mais en même temps, je ne pense pas qu'il y ait un problème ici de toute façon.

Est-ce que ma sortie constitue un fragment XML? Est-ce qu'il me manque quelque chose dans la feuille de style?

+0

@ Chris - vous ne jamais comprendre cela? J'obtiens cette erreur –

Répondre

7

L'exception est d'essayer de vous dire que vous avez essayé de sortir du texte après l'élément close de l'élément racine. La raison pour laquelle votre sortie semble correcte est que l'exception a empêché la génération du code XML non valide.

La raison est simple: vous n'avez pas de transformation pour la racine du document. Par conséquent, les transformations par défaut sont effectuées. Ceux-ci afficheront le contenu textuel de tous les éléments sous forme de nœuds de texte.

Ajouter

<xsl:template match="/"> 
    <xsl:apply-templates select="/Root/Documents/PO/DROPSHIP"/> 
</xsl:template> 
0

Votre sortie constitue un fragment XML bien formé. En d'autres termes, cela semble correct, tout comme votre XSLT.

Il semble que le message d'erreur essaie de vous dire ce qui suit:

L'application de cette XSLT produit un document qui est invalide selon la DTD ou schéma, ou tout ce que je me sers pour valider la sortie, et mon conformanceLevel me dit se plaindre de la sortie invalide. Si vous ne vous souciez pas de la validité, réglez mon conformanceLevel sur quelque chose de moins anal.

Notez la différence importante entre « bien formé » (un analyseur XML non conforme validants peut le lire) et « valide » (la structure ne suit pas la grammaire spécifiée dans un schéma).

Notez également qu'il est impossible dans XSLT de produire une sortie qui n'est pas bien formée au format XML.

+0

Pour l'instant les espaces de noms de sortie n'ont pas un DTD ou XSD ou tout autre schéma formel derrière eux, donc il ne devrait pas être valide contre quelque chose du tout. Serait-il s'attendre à? –

+0

Il n'y a aucune raison de le faire. Pourtant, il semble que votre processeur xsl effectue une validation sur SOME schéma. Sinon, vous n'obtiendrez pas une erreur "document XML non valide". – ddaa

Questions connexes