From: Pierre Attar (pat@tireme.fr)
Date: 14/11/2003 - 21:19
Il faut donc "enrober" le key pour être sur d'être dans le bon document
quand on charge la clé (les clés ne sont chargées qu'à leur première
utilisation) :
<xsl:for-each select="document('extraDoc.xml')">
<xsl:apply-templates select="key('Indexes',$Name)"/>
</xsl:for-each>
Pour les explications, voir
http://www.biglist.com/lists/xsl-list/archives/200101/msg00217.html
Après, il restera une erreur dans la déclaration de la clé ou il manquait
le préfix d'espace de nom a:
<xsl:key name="Indexes" match="c:Indexes" use="../a:Name"/>
Bon courage pur la suite,
Pierre
At 18:03 14/11/2003, you wrote:
> > Oui mais voilà, on a pas les fichiers car pas d'attachement pour éviter les
> > virus.
> >
> > En fait, c'est mieux car ca oblige à être un peu synthétique dans la
> > question ;-)
> >
>
>Oups ... desole.
>
> Comme j'avais deja degraisse au maximum les trois fichiers
> en question tout en rajoutant des commentaires un peu partout,
> je me permet de les recopier tel que a la fin de mon mail au cas ou ;)
>
> Au passage, j'ai eu l'occasion depuis tout a l'heure de tester deux
> autres processeurs.
>
> Xalan4J V2 et Xalan4C++ 1.6.
>
> Ca n'a pas resolut mon probleme, voir pire, ca l'a complique.
>
> Maintenant je me retrouve avec 3 sortie differentes :))
>
>Benoit.
>
>-------- keyProblemInput.xml : --------
><?xml version="1.0"?>
><?xml-stylesheet href="./keyProblem.xsl" type="Text/xsl"?>
><DBModel>
> <Class Name="Country">
> <Attribute Name="Id">
> <Type>OID</Type>
> <Null>False</Null>
> <Key>True</Key>
> <SQLType>binary(12)</SQLType>
> </Attribute>
> <Attribute Name="ShortName">
> <Type>Char(16)</Type>
> <Null>False</Null>
> <Key>False</Key>
> <SQLType>varchar(16)</SQLType>
> </Attribute>
> <Attribute Name="Name">
> <Type>Char(50)</Type>
> <Null>False</Null>
> <Key>False</Key>
> <SQLType>varchar(50)</SQLType>
> </Attribute>
> <Attribute Name="CurrencyId">
> <Type>OID</Type>
> <Null>True</Null>
> <Key>False</Key>
> <SQLType>binary(12)</SQLType>
> </Attribute>
> </Class>
></DBModel>
>
>
>-------- keyProblem.xsl : --------
><?xml version="1.0" encoding="UTF-8"?>
><!--
> Cette stylesheet copie le document sur lequel elle travail tout en
> y ajoutant des parites du fichier "extraDoc.xml". Celui-ci est charge
> grace a la fonction XSL "document"
> Le probleme : Seul un des deux indexes suivants semble fonctionner
> Question : Pourquoi ?
>-->
>
>
><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> xmlns:a="attribute" xmlns:c="collection" xmlns:o="object">
> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"
> media-type="xml"/>
>
> <!-- Cette clef sert a indexer des noeuds en provenance du fichier
> extraDoc.xml.
> Ceux ayant un espace de nomage "object", un attribut "Id" et un
> fils "Name".
> Ces noeud sont index par rapport a leur attribut Id -->
> <xsl:key name="Objects" match="o:*[@Id][a:Name]" use="@Id" />
>
> <!-- Cette clef sert a indexer des noeuds en provenance du fichier
> extraDoc.xml.
> Ce sont les noeuds c:Indexes et ils sont indexe par rapport a la
> valeur du
> noeud "Name" de leur noeud parent -->
> <xsl:key name="Indexes" match="c:Indexes" use="../Name" />
>\
> <!-- Cette variable contiend l'arbre representant le fichier XML
> "extraDoc.xml" -->
> <xsl:variable name="ExtraDoc" select="document( 'extraDoc.xml' )" />
>
> <!-- Le premier template est le template identite.
> C'est lui qui fait la majeur partie du travail de recopie -->
> <xsl:template match="/ | @* | * | comment() | processing-instruction()
> | text()">
> <xsl:copy>
> <xsl:apply-templates select="@* | * | comment() |
> processing-instruction() | text()" />
> </xsl:copy>
> </xsl:template>
>
> <!-- Ce template reagie lorsqu'un noeud "Class" est lu dans le document
> principale.
> Afin qu'il prime sur le template identite, sa priorite a ete
> augmente -->
> <xsl:template match="Class" priority="1">
> <!-- 1) on stock dans un la variable Name le nom de la class -->
> <xsl:variable name="Name" select="@Name" />
> <!-- 2) on recopie le noeud courant -->
> <xsl:copy>
> <!-- 3) afin de poursuivre la copie on appel a nouveau le template
> identite -->
> <xsl:apply-templates select="@* | * | comment() |
> processing-instruction() | text()" />
> <xsl:element name="SelectVariable">
> <!-- 4) on appel le template identite sur une partie du
> document "extraDoc.xml" -->
> <xsl:apply-templates
> select="$ExtraDoc//o:Table[a:Name=$Name]/c:Indexes" />
> </xsl:element>
> <xsl:element name="SelectKey">
> <!-- 5) on fait la meme chose que precedement mais via la clef
> "Indexes" -->
> <xsl:apply-templates select="key('Indexes',$Name)" />
> </xsl:element>
> </xsl:copy>
> </xsl:template>
>
> <!-- Ce template reagit sur les noeuds definits dans le namespace
> "object" qui ont
> un atribut Ref. Ce type de noeud n'existe que dans le fichier
> "extraDoc.xml" -->
> <xsl:template match="o:*[@Ref]" priority="2">
> <!-- 1) on recopie le noeud -->
> <xsl:copy>
> <!-- 2) on complete la copie en appelant a nouveau le template
> identite -->
> <xsl:apply-templates select="@* | * | comment() |
> processing-instruction() | text()" />
> <!-- 3) on y ajoute un attribut "Name" ayant le nom de l'objet
> reference par @Ref -->
> <xsl:attribute name="Name">
> <xsl:value-of select="key('Objects',@Ref)/a:Name" />
> </xsl:attribute>
> </xsl:copy>
> </xsl:template>
></xsl:stylesheet>
>
>
>-------- extraDoc.xml : --------
><?xml version="1.0" encoding="UTF-8"?>
><!-- edited with XMLSPY v2004 rel. 3 U (http://www.xmlspy.com) by Lefevre
>(Reuters) -->
><Model xmlns:a="attribute" xmlns:c="collection" xmlns:o="object">
> <o:Model Id="o2">
> <c:Tables>
> <o:Table Id="o1616">
> <a:Name>Country</a:Name>
> <c:Columns>
> <o:Column Id="o2473">
> <a:Name>Id</a:Name>
> <a:DataType>binary(12)</a:DataType>
> <a:Length>12</a:Length>
> <a:Mandatory>1</a:Mandatory>
> </o:Column>
> <o:Column Id="o2475">
> <a:Name>Name</a:Name>
> <a:DataType>varchar(40)</a:DataType>
> <a:Length>40</a:Length>
> <a:Mandatory>1</a:Mandatory>
> </o:Column>
> </c:Columns>
> <c:Indexes>
> <o:Index Id="o2485">
> <a:Name>CountryIdx1</a:Name>
> <a:Unique>1</a:Unique>
> <c:IndexColumns>
> <o:IndexColumn Id="o2486">
> <c:Column>
> <o:Column Ref="o2473"/>
> </c:Column>
> </o:IndexColumn>
> </c:IndexColumns>
> </o:Index>
> </c:Indexes>
> </o:Table>
> </c:Tables>
> </o:Model>
></Model>
>
>
>-------------------
>
>
>
>
>
>
>--------------------------------------------------------------- -
> Visit our Internet site at http://www.reuters.com
>
>Get closer to the financial markets with Reuters Messaging - for more
>information and to register, visit http://www.reuters.com/messaging
>
>Any views expressed in this message are those of the individual
>sender, except where the sender specifically states them to be
>the views of Reuters Ltd.
>
>--
>Devenez redacteur <XML>fr et contribuez au developpement du
>xml francophone (http://xmlfr.org/infos/redacteurs/) !
>
>Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
>
>Cette liste est a votre disposition pour discuter en francais de
>tout sujet technique lie a XML.
>
>Pour resilier votre abonnement, envoyez un message contenant
>la commande "unsubscribe" a xml-tech-request@xmlfr.org
>(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
Archive générée par hypermail 2.1.3 le 28/06/2004 - 11:06 UTC
webmaster@xmlfr.org
|