From: Benoit.Lefevre@reuters.com
Date: 14/11/2003 - 17:03
> 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)
Archive générée par hypermail 2.1.3 le 28/06/2004 - 11:06 UTC
webmaster@xmlfr.org
|