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!