Question

Je génère un document XML à partir d'un objet Entity Framework. Le XML généré ressemble à ceci:

XML COMPLET REPOSÉ

<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>

C'était la feuille de style qui fonctionnait hier, mais quelque chose a changé dans mon XML: vous pouvez voir les compositions avec le nom local par opposition à 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 rencontre avec la liste des espaces de noms est que certains d'entre eux se chevauchent en fonction du contexte au niveau de la balise, ce qui pourrait être le problème qui en résulte. Évidemment, hier, j'utilisais un code source XML différent (argh) ou un ensemble d'objets totalement différent. (Dans tous les cas, si la source change, le XSLT ne devrait pas exploser de la sorte.)

Pour l'instant, je suis obligé d'utiliser l'approche locale-name (), mais j'aimerais vraiment comprendre cela.

Était-ce utile?

La solution

provisoirement ... Désolé, je n'ai pas le temps de tester le fonctionnement suivant ...

MODIFIER (après une longue journée de travail ...) Oui! C'était à peu près correct. Il manque seulement un * pour la chaîne de correspondance de modèle, qui devrait être " / * " pas seulement " / "

Cela a été vérifié avec un fichier XML créé en copiant celui de la question du PO (avec les modifications nécessaires, car l'exemple 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 des tests rapides, à lire après l'extrait de code pour une meilleure façon 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 espaces de noms

Le modèle de données XPath considère un document XML comme une arborescence de nœuds, tels que des nœuds d'élément, d'attribut et de texte, le nom de chaque nœud étant une combinaison de son nom local et de son nom d'espace de nom. Il est intéressant de noter que XPath traite l’espace de noms par défaut d’une manière incohérente. C’est pourquoi on ne remarque pas tout ce problème xmlns tant que les éléments ciblés par le XSL n’appartiennent pas à des éléments nommés pleinement qualifiés dans le XML d’entrée .... voir ceci < a href = "http://www.xml.com/pub/a/2004/02/25/qanda.html" rel = "nofollow noreferrer"> link pour plus de détails.

Lorsqu'il est confronté à une entrée XML comportant des éléments spécifiés par xmlns, un rédacteur de script XSL doit s'assurer de qualifier complètement les noms de ses noeuds cibles (approche recommandée) ou utiliser l'astuce local-name () ci-dessus pour indiquer à XPath d'ignorer les espaces de noms. Pour utiliser les noms préfixés par xmlns, un préfixe court peut être défini comme d'habitude et il peut ensuite être utilisé par la logique XSL, comme suit. (les xmlns réels peuvent être incorrects, car l'exemple de fichier xml 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top