Re: Extend XML file attributes using XSLT

"Christian Rühl" <[email protected]> Mon, 26 Nov 2007 03:22:22 -0800 (PST)
Newsgroups gmane.comp.mozilla.devel.layout.xslt
Organization http://groups.google.com
Message-ID <[email protected]>
On 23 Nov., 11:44, "Christian Rühl" <[email protected]> wrote:
> On 23 Nov., 09:15, "Christian Rühl" <[email protected]> wrote:
>
>
>
> > new day, new problem here... :(
>
> > i have two xml files with some similar attributes. i want to copy
> > specific content (namely attributes) from one xml file to the other.
>
> > to show you of what i'm talking, heres how my archive and my product
> > tree xml files look like (very abstract):
>
> > --- archive.xml ---
>
> > <Common name="..." path="..." />
> > <Common ... />
> > <Glue name="..." path="..." />
> > <Glue ... />
> > <Mtds name="..." path="..." />
> > <Mtds ... />
> > <Mtds ... />
> > <ARCHIVE>
> > <Module moduleName="moduleA" variant="2" subsystem="subsystemA"
> > path="..." textConvention="..." />
> > <Module moduleName="moduleX" variant="17" subsystem="subsystemB"
> > path="..." textConvention="..." />
> > <Product cid="9000" subsystem="subsystemD" path="..."
> > textConvention="..." />
> > </ARCHIVE>
>
> > --- prodtree.xml ---
>
> > <PRODUCT_TREE productName="TestProduct" softwareVersion="1.0"
> > description="...">
> > <TopLevelComponent topLevelModule="Mab" cid="1200" description="...">
> > <Module selectedModule="moduleA" instance="12"/>
> > <Component topLevelModule="Mxy" cid="9000" description="...">
> > <SubComponent topLevelModule="Mxy" cid="5500" description="...">
> > <Module selectedModule="moduleX" instance="1"/>
> > </SubComponent>
> > </Component>
> > </TopLevelComponent>
> > </PRODUCT_TREE>
>
> > ------------------------------------------
> > hint:
> > PRODUCT_TREE/selectedModule == ARCHIVE/moduleName
> > ------------------------------------------
>
> > what i want to do now is to extend the prodtree.xml as said below:
>
> > - for all <*Component> nodes: check if there is a <Product> node in
> > archive.xml with the same cid? if so: copy all other attributes from
> > that node.
> > - for all <Module> nodes: check if there is a <Module> node in
> > archive.xml with the selectedModule == moduleName? if so: copy all
> > other attributes from that node.
>
> > so that the outcome looks like this:
>
> > --- result.xml ---
>
> > <PRODUCT_TREE productName="TestProduct" softwareVersion="1.0"
> > description="...">
> > <TopLevelComponent topLevelModule="Mab" cid="1200" description="...">
> > <Module selectedModule="moduleA" instance="12" variant="2"
> > subsystem="subsystemA" path="..." textConvention="..."/>
> > <Component topLevelModule="Mxy" cid="9000" subsystem="subsystemD"
> > path="..." description="...">
> > ...
> > </PRODUCT_TREE>
>
> > ------------------------------------------
>
> > i really hope you can help me again! thats how far i came by now:
>
> > <?xml version="1.0"?>
> > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> > version="1.0">
> >         <xsl:output method="xml" indent="yes"/>
> >         <xsl:param name="archive"/>
> >         <xsl:template match="/">
> >                 <TOP>
> >                         <xsl:for-each select="TopLevelComponent">
> >                                 <TopLevelComponent cid="{@cid}" topLevelModule="{@topLevelModule}"
> > softwareVersion="{@softwareVersion}">
> >                                         <xsl:variable name="cid" select="string(@cid)"/>
> >                                         <xsl:for-each select="document($archive)">
> >                                                 <xsl:copy-of select="cid($cid)/*"/>
> >                                         </xsl:for-each>
> >                                 </TopLevelComponent>
> >                         </xsl:for-each>
> >                 </TOP>
> >         </xsl:template>
> > </xsl:stylesheet>
>
> > doesn't work of course... :(
>
> Ooops, I just got the advice that my posting style is a little
> annoying...
> I beg your pardon for that and I will try to make a better
> questioning. And don't get me wrong - I don't want you to do my job!
> But of course I need your help!
>
> So here are my files (as you might call it SSCCE):
>
> ----- archive.xml -----
> <?xml version="1.0" encoding="UTF-8"?>
> <PMBv2>
>         <ARCHIVE>
>                 <Common path="D:/common/common_1.tmp" name="common_1"/
>
>                 <Common path="D:/common/common_2.tmp" name="common_2"/
>
>                 <Common path="D:/common/common_3.tmp" name="common_3"/
>
>                 <Glue path="D:/glue/glue_1.tmp" name="glue_1"/>
>                 <Glue path="D:/glue/glue_2.tmp" name="glue_2"/>
>                 <Mtds path="D:/mtds/mtds_1.tmp" name="mtds_1"/>
>                 <Mtds path="D:/mtds/mtds_2.tmp" name="mtds_2"/>
>                 <Mtds path="D:/mtds/mtds_3.tmp" name="mtds_3"/>
>                 <Mtds path="D:/mtds/mtds_4.tmp" name="mtds_4"/>
>                 <Mtds path="D:/mtds/mtds_5.tmp" name="mtds_5"/>
>                 <Mtds path="D:/mtds/mtds_6.tmp" name="mtds_6"/>
>                 <Mtds path="D:/mtds/mtds_7.tmp" name="mtds_7"/>
>                 <Mtds path="D:/mtds/mtds_8.tmp" name="mtds_8"/>
>                 <Mtds path="D:/mtds/mtds_9.tmp" name="mtds_9"/>
>                 <Module path="D:/module-specific/
> module_mt_m1235_3_{MNCL}{MNCN}
> {MNMI}.tmp" mid="m1235" moduleName="MODULE-MT-M1235-3-TMP" variant="3"
> tokens="{MNCL}{MNCN}{MNMI}" tc="D:/module_tc/module_mt_m1235_tc.tmp"/>
>                 <Module path="D:/module-specific/
> module_mt_m1237_2_subsystemA_{MNCL}
> {MNCN}{MNMI}.tmp" mid="m1237" moduleName="MODULE-MT-M1237-2-
> SUBSYSTEMA-
> TMP" variant="2" subsystem="subsystemA" tokens="{MNCL}{MNCN}{MNMI}"
> tc="D:/module_tc/module_mt_m1237_tc.tmp"/>
>                 <Product path="D:/product-specifc/
> product_mt_product_9000_{MNCL}
> {MNCN}{MNMI}.tmp" cid="5500" moduleName="PRODUCT-MT-PRODUCT-9000-MIB"
> tokens="{MNCL}{MNCN}{MNMI}"/>
>                 <Product path="D:/product-specifc/
> product_mt_product_5500_subsystemX_{MNCL}{MNCN}{MNMI}.tmp" cid="5500"
> moduleName="PRODUCT-MT-PRODUCT-5500-SUBSYSTEMX-MIB"
> subsystem="subsystemX" tokens="{MNCL}{MNCN}{MNMI}" tc="D:/module_tc/
> product_mt_product_5500_tc.tmp"/>
>         </ARCHIVE>
> </PMBv2>
>
> ----- prodtree.xml -----
> <?xml version="1.0" encoding="UTF-8"?>
> <PMBv2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:noNamespaceSchemaLocation="D:\PMBv2\install
> \pmbv2_prodtree_schema.xsd">
>         <PRODUCT_TREE productName="MyProduct" description="Text"
> softwareVersion="2.0">
>                 <TopLevelComponent topLevelModule="M14" cid="1700"
> description="Text">
>                         <Module selectedModule="MODULE-MT-M1235-3-MIB"
> instance="23"
> description="Text"/>
>                         <Component topLevelModule="M16" cid="1300"
> description="Component
> description.">
>                                 <Module instance="12"
> description="Text" selectedModule="MODULE-MT-
> M1236-2-TMP"/>
>                                 <SubComponent topLevelModule="M16"
> cid="5500" description="Text">
>                                         <Module instance="10"
> description="Text" selectedModule="MODULE-
> MT-M1235-3-TMP"/>
>                                 </SubComponent>
>                                 <SubComponent topLevelModule="M14"
> cid="1300" description="Text">
>                                         <Module instance="17"
> description="Text" selectedModule="MODULE-
> MT-M1235-4-TMP"/>
>                                         <SubComponent
> topLevelModule="M9" cid="9000" description="Text">
>                                                 <Module instance="12"
> description="Text" selectedModule="MODULE-
> MT-M1235-3-TMP"/>
>                                         </SubComponent>
>                                 </SubComponent>
>                         </Component>
>                 </TopLevelComponent>
>         </PRODUCT_TREE>
> </PMBv2>
>
> So, what I want to do now is the following:
> - copy all <Common>, <Glue> and <Mtds> nodes to prodtree.xml
>
> For each node in prodtree.xml check if
> - there is a <Product> in archive.xml with the same cid attribute.
> -->if so: append all attributes (that would then be: path, subsystem,
> moduleName and tokens)  to my <*Component> node in prodtree.xml
> - there is a <Module> in archive.xml where the moduleName attribute
> has the same value as my current selectedModule attribute
> --> if so: append all attributes (that would then be: path, mid,
> variant, tokens, tc and subsystem) to the my <Module> node in
> prodtree.xml
>
> BTW: I already signed up for a XSLT workshop in January. But until
> then it looks like I have to figure things out myself... And I can't
> just make things like that out of thin air. :(
>
> BTW2: Forget about that code snippet in my earlier post. That doesn't
> make sense at all... Just a little trial and error gambling. :-D
>
> Greets,
> Chris

I just can't find a solution... I've been searching and trying but
there's absolutely nothing I found yet.

All I want is to compare the attributes of two xml files! That just
can't be too tough, can it?

<xsl:param name="archive"/>
<xsl:param name="tree"/>

archive:
<root>
   <module mid="17" variant="2" path="c:/bla.tmp"/>
   <product cid="12" subsystem="bla" path="c:/bla.tmp"/>
</root>

tree:
<root>
   <component cid="12">
   <module m="17" instance="5"/>
      <component cid="13">
         <module m="23" instance="54"/>
      </component>
   </component>
</root>

All I want is something like that:

<root>
   <component cid="12" subsystem="bla" path="c:/bla.tmp">
   <module m="23" instance="5"/>
      <component cid="13">
         <module m="17" instance="54"  variant="2" path="c:/bla.tmp"/>
      </component>
   </component>
</root>

Simply compare the attributes of the primary "tree" to the ones of the
secondary "archive" and if there is a match like component/@cid<-
>product/@cid or further module/@mid<->module/@mid: add the rest of
the secondary attributes to the primary ones.

Please, I really need help with that!