2009-09-09 9 views
1

J'ai un document XML que je génère à partir d'un objet Entity Framework. Le XML généré ressemble à ceci:Problèmes de transformation d'EntityObject XML avec XSLT

Republiée XML COMPLET

<Task z:Id="i1" xmlns="http://schemas.datacontract.org/2004/07/MCC.DAL" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"> 
    <EntityKey z:Id="i2" xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" 
      xmlns:a="http://schemas.datacontract.org/2004/07/System.Data"> 
    <a:EntityContainerName>Editorial_MasterEntities</a:EntityContainerName> 
    <a:EntityKeyValues> 
     <a:EntityKeyMember> 
     <a:Key>TaskID</a:Key> 
     <a:Value i:type="b:int" xmlns:b="http://www.w3.org/2001/XMLSchema">1670</a:Value> 
     </a:EntityKeyMember> 
    </a:EntityKeyValues> 
    <a:EntitySetName>Task</a:EntitySetName> 
    </EntityKey> 
    <FormCOIAns i:nil="true" /> 
    <FormCOIAnsReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"> 
    <a:EntityKey i:nil="true" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" /> 
    </FormCOIAnsReference> 
    <FormCrownLicAns z:Id="i3"> 
    <EntityKey z:Id="i4" xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" xmlns:a="http://schemas.datacontract.org/2004/07/System.Data"> 
     <a:EntityContainerName>Editorial_MasterEntities</a:EntityContainerName> 
     <a:EntityKeyValues> 
     <a:EntityKeyMember> 
      <a:Key>TaskID</a:Key> 
      <a:Value i:type="b:int" xmlns:b="http://www.w3.org/2001/XMLSchema">1670</a:Value> 
     </a:EntityKeyMember> 
     </a:EntityKeyValues> 
     <a:EntitySetName>FormCrownLicAns</a:EntitySetName> 
    </EntityKey> 
    <CrownAgreement>1</CrownAgreement> 
    <GovernmentAgency>ASDSADSADSADSA</GovernmentAgency> 
    <Task z:Ref="i1" /> 
    <TaskID>1670</TaskID> 
    <TaskReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"> 
     <a:EntityKey z:Ref="i2" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" /> 
    </TaskReference> 
    </FormCrownLicAns> 
    <FormCrownLicAnsReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"> 
    <a:EntityKey z:Ref="i4" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" /> 
    </FormCrownLicAnsReference> 
    <FormStdLicAns i:nil="true" /> 
    <FormStdLicAnsReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"> 
    <a:EntityKey i:nil="true" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" /> 
    </FormStdLicAnsReference> 
    <FormType i:nil="true" /> 
    <FormTypeReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"> 
    <a:EntityKey z:Id="i5" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data"> 
     <b:EntityContainerName>Editorial_MasterEntities</b:EntityContainerName> 
     <b:EntityKeyValues> 
     <b:EntityKeyMember> 
      <b:Key>FormType_ID</b:Key> 
      <b:Value i:type="c:int" xmlns:c="http://www.w3.org/2001/XMLSchema">3</b:Value> 
     </b:EntityKeyMember> 
     </b:EntityKeyValues> 
     <b:EntitySetName>FormType</b:EntitySetName> 
    </a:EntityKey> 
    </FormTypeReference> 
    <LastModified i:nil="true" /> 
    <Manuscript z:Id="i6"> 
    <EntityKey z:Id="i7" xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" xmlns:a="http://schemas.datacontract.org/2004/07/System.Data"> 
     <a:EntityContainerName>Editorial_MasterEntities</a:EntityContainerName> 
     <a:EntityKeyValues> 
     <a:EntityKeyMember> 
      <a:Key>ManuscriptID</a:Key> 
      <a:Value i:type="b:int" xmlns:b="http://www.w3.org/2001/XMLSchema">3000004</a:Value> 
     </a:EntityKeyMember> 
     <a:EntityKeyMember> 
      <a:Key>PubID</a:Key> 
      <a:Value i:type="b:int" xmlns:b="http://www.w3.org/2001/XMLSchema">3</a:Value> 
     </a:EntityKeyMember> 
     </a:EntityKeyValues> 
     <a:EntitySetName>Manuscript</a:EntitySetName> 
    </EntityKey> 
    <Editor i:nil="true" /> 
    <EditorReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"> 
     <a:EntityKey z:Id="i8" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data"> 
     <b:EntityContainerName>Editorial_MasterEntities</b:EntityContainerName> 
     <b:EntityKeyValues> 
      <b:EntityKeyMember> 
      <b:Key>EditorID</b:Key> 
      <b:Value i:type="c:int" xmlns:c="http://www.w3.org/2001/XMLSchema">3</b:Value> 
      </b:EntityKeyMember> 
     </b:EntityKeyValues> 
     <b:EntitySetName>Editor</b:EntitySetName> 
     </a:EntityKey> 
    </EditorReference> 
    <ManuscriptID>3000004</ManuscriptID> 
    <ManuscriptStatus i:nil="true" /> 
    <ManuscriptStatusReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"> 
     <a:EntityKey i:nil="true" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" /> 
    </ManuscriptStatusReference> 
    <PubID>3</PubID> 
    <Publication i:nil="true" /> 
    <PublicationReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"> 
     <a:EntityKey z:Id="i9" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data"> 
     <b:EntityContainerName>Editorial_MasterEntities</b:EntityContainerName> 
     <b:EntityKeyValues> 
      <b:EntityKeyMember> 
      <b:Key>PubID</b:Key> 
      <b:Value i:type="c:int" xmlns:c="http://www.w3.org/2001/XMLSchema">3</b:Value> 
      </b:EntityKeyMember> 
     </b:EntityKeyValues> 
     <b:EntitySetName>Publication</b:EntitySetName> 
     </a:EntityKey> 
    </PublicationReference> 
    <Task> 
     <Task z:Ref="i1" /> 
    </Task> 
    <Title>test</Title> 
    </Manuscript> 
    <ManuscriptReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"> 
    <a:EntityKey z:Ref="i7" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" /> 
    </ManuscriptReference> 
    <MasterPerson z:Id="i10"> 
    <EntityKey z:Id="i11" xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" xmlns:a="http://schemas.datacontract.org/2004/07/System.Data"> 
     <a:EntityContainerName>Editorial_MasterEntities</a:EntityContainerName> 
     <a:EntityKeyValues> 
     <a:EntityKeyMember> 
      <a:Key>MPID</a:Key> 
      <a:Value i:type="b:int" xmlns:b="http://www.w3.org/2001/XMLSchema">1380007</a:Value> 
     </a:EntityKeyMember> 
     </a:EntityKeyValues> 
     <a:EntitySetName>MasterPerson</a:EntitySetName> 
    </EntityKey> 
    <Comments i:nil="true" /> 
    <Created>2008-01-08T14:14:01.867</Created> 
    <Do_Not_Use>false</Do_Not_Use> 
    <Editor /> 
    <FName>tony</FName> 
    <LName>kim</LName> 
    <MName /> 
    <MPGUID>C6C28CFFD41A4106B3FDB4CFBBF79B63</MPGUID> 
    <MPID>1380007</MPID> 
    <Prefix i:nil="true" /> 
    <Suffix i:nil="true" /> 
    <Task> 
     <Task z:Ref="i1" /> 
    </Task> 
    <Updated>2008-01-08T14:14:01.867</Updated> 
    </MasterPerson> 
    <MasterPersonReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"> 
    <a:EntityKey z:Ref="i11" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" /> 
    </MasterPersonReference> 
    <TaskID>1670</TaskID> 
    <TaskStatus z:Id="i12"> 
    <EntityKey z:Id="i13" xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" xmlns:a="http://schemas.datacontract.org/2004/07/System.Data"> 
     <a:EntityContainerName>Editorial_MasterEntities</a:EntityContainerName> 
     <a:EntityKeyValues> 
     <a:EntityKeyMember> 
      <a:Key>TaskStatusID</a:Key> 
      <a:Value i:type="b:int" xmlns:b="http://www.w3.org/2001/XMLSchema">3</a:Value> 
     </a:EntityKeyMember> 
     </a:EntityKeyValues> 
     <a:EntitySetName>TaskStatus</a:EntitySetName> 
    </EntityKey> 
    <Description>Completed</Description> 
    <Task> 
     <Task z:Ref="i1" /> 
    </Task> 
    <TaskStatusID>3</TaskStatusID> 
    </TaskStatus> 
    <TaskStatusReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"> 
    <a:EntityKey z:Ref="i13" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" /> 
    </TaskStatusReference> 
</Task> 

Ce fut le stylesheet qui travaillait hier, mais de toute évidence quelque chose a changé dans mon XML - vous pouvez voir les cadeaux de fidélité avec le nom local vs. XPath.

<?xml version='1.0'?> 
    <xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" 
     xmlns:c="http://www.w3.org/2001/XMLSchema" 
     xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" 
     xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" 
     xmlns="http://schemas.datacontract.org/2004/07/MCC.DAL"> 
     <!--xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" --> 

     <xsl:template match="/*"> 
     <DIV STYLE="font-weight:bold"> 
      Local name:<xsl:value-of select="/*[local-name()='Task']/*[local-name()='MasterPerson']/*[local-name()='FName']" /><br /> 
      XPath:<xsl:value-of select="/Task/MasterPerson/FName"/> 
     </DIV> 
     </xsl:template> 
    </xsl:stylesheet> 

Le problème que je vais avoir la liste les espaces de noms est que certains d'entre eux se chevauchent en fonction du contexte au niveau des tags, de sorte que pourrait être le problème résultant. Évidemment, hier, j'utilisais une autre source XML (argh) ou juste un ensemble d'objets différent. (De toute façon, si la source change, elle ne devrait pas faire exploser le XSLT comme ça.)

Maintenant, je suis relégué à utiliser l'approche de nom local(), mais j'aimerais vraiment comprendre cela.

+0

Votre XML n'a pas un élément complet, donc je ne peux pas le charger. Si je ferme les éléments ouverts, je n'obtiens aucun résultat avec Xalan même si j'enlève les éléments de l'espace de nommage, car il n'y a pas de 'MasterPerson' dans votre exemple. –

+0

Désolé Tim - c'était trop grand. –

+0

@CP: Désolé pour la modification, mais j'ai trouvé assez confus de lire la réponse avant la question. ;-) J'ai également indenté le XML et l'ai rendu bien formé. Oh, et bienvenue à SO. :-) – Tomalak

Répondre

2

... Provisoirement Désolé je n'ai pas le temps de vérifier que les travaux suivants ...

EDIT (finition après une longue journée de travail ...) Oui! C'était à peu près juste. Cela manquait seulement un * pour la chaîne de correspondance du modèle, qui devrait être "/ *" et pas seulement "/"

Ceci a été testé avec un fichier XML fait en copiant cela à partir de la question de l'OP (avec les modifications nécessaires depuis le échantillon XML de la question est fragmentaire). Attention, cependant! L'utilisation de l'astuce * [local-name() = 'xyz'] pour ignorer les espaces de noms doit être conservée pour les tests rapides, lire après l'extrait de code pour une manière préférable de gérer ces espaces de noms XML.

<xsl:template match="/"> 
    <DIV STYLE="font-weight:bold"> 
     <xsl:value-of select="*[local-name()='Task']/*[local-name()='MasterPerson']/*[local-name()='FName']" /> 
    </DIV> 
    </xsl:template> 

XPath et des espaces de noms

Le modèle de données XPath traite un document XML comme un arbre de noeuds, tels que l'élément, attribut, et les nœuds de texte, où le nom de chaque noeud est une combinaison de son nom local et son nom d'espace de nommage. Il est intéressant de noter que XPath traite l'espace de nom par défaut d'une manière incohérente, et c'est pourquoi on ne remarque pas tout ce problème xmlns jusqu'à ce que les éléments ciblés par le XSL appartiennent à des éléments qualifiés complets dans le XML d'entrée .... voir link pour plus de détails. Lorsqu'il est confronté à une entrée XML contenant des éléments spécifiés par xmlns, un scripteur XSL doit s'assurer de qualifier complètement les noms de ses nœuds cibles (approche préférée) ou utiliser l'astuce local-name() indiquée ci-dessus pour indiquer à XPath de ignorer les espaces de noms. Pour utiliser les noms préfixés xmlns, un préfixe court peut être défini comme d'habitude et il peut ensuite être utilisé par la logique XSL, comme suit. (Xmlns réels peuvent se tromper, que le fichier xml échantillon est incomplet)

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:t="http://schemas.datacontract.org/2004/07/MCC.DAL"> 

<xsl:template match="/MyRoot"> 
    <DIV STYLE="font-weight:bold"> 
     <xsl:value-of select="t:Task/i:MasterPerson/i:FName" /> 
    </DIV> 
    </xsl:template> 
</xsl:stylesheet> 
+0

L'approche local-name() fonctionne pour moi si j'ajoute un "/" avant l'expression. Quels sont les inconvénients de l'utilisation de l'approche du nom local? Juste curieux ... Je vais voir si je peux ajouter tous ces espaces de noms à mon XSLT, restez à l'écoute. Merci! CP –

+0

À droite, le/peut être nécessaire, en fonction de l'entrée XML. L'inconvénient d'ignorer l'espace de noms (avec l'approche du nom local): les expressions XPath qui les utilisent sont moins précises, pouvant correspondre à de "mauvais" nœuds qui ont le même nom dans un autre espace de noms, ou ne vous permettent pas pour exprimer le même type de spécificité par exemple dans les sélecteurs tels que ceux qui impliquent des attributs de nœud (@ chose) et autres. En un mot, votre expression XPath est au mieux plus longue et plus arcane, et au pire un peu moins spécifique, correspondant éventuellement à des cibles non désirées. – mjv