GGrollenMedlem sedan dec. 20039 inlägg Frågan#1 Hej!
Jag har ett xml-dokument av följande struktur:
<NewDataSet>
<Blad1>
<F1>KAT1</F1>
<F2>A1</F2>
<F3>XXX1</F3>
<F4>11</F4>
</Blad1>
<Blad1>
<F1>KAT1</F1>
<F2>B1</F2>
<F3>YYY1</F3>
<F4>22</F4>
</Blad1>
<Blad1>
<F1>KAT1</F1>
<F2>C1 </F2>
<F3>ZZZ1</F3>
<F4>33</F4>
</Blad1>
<Blad1>
<F1>KAT2</F1>
<F2>A2</F2>
<F3>XXX2</F3>
<F4>111</F4>
</Blad1>
<Blad1>
<F1>KAT2</F1>
<F2>B2</F2>
<F3>YYY2</F3>
</Blad1>
<Blad1>
<F1>KAT3</F1>
<F2>A3</F2>
<F3>XXX3</F3>
</Blad1>
<NewDataSet>
och skulle behöva få följande struktur m.h.a XSL
<LOG>
<Kategori name = KAT1>
[INDENT]<Name name = A1>
[INDENT]<Data1> XXX1 </Data1>
<Data2> 11 </Data1>[/INDENT]
</Name>[/INDENT]
[INDENT]<Name name = B1>
[INDENT]<Data1> YYY1 </Data1>
<Data2> 22 </Data1>[/INDENT]
</Name>[/INDENT]
[INDENT]<Name name = C1>
[INDENT]<Data1> ZZZ1 </Data1>
<Data2> 33 </Data1>[/INDENT]
</Name>[/INDENT]
</Kategori>
<Kategori name = KAT2>
[INDENT]<Name name = A2>
[INDENT]<Data1> XXX2 </Data1>
<Data2> 111 </Data1>[/INDENT]
</Name>[/INDENT]
[INDENT]<Name name = B2>
[INDENT]<Data1> YYY2 </Data1>
<Data2> 222 </Data1>[/INDENT]
</Name>[/INDENT]
</Kategori>
<Kategori name = KAT3>
[INDENT]<Name name = A3>
[INDENT]<Data1> XXX3 </Data1>
<Data2> 1111 </Data1>[/INDENT]
</Name>[/INDENT]
</Kategori>
</LOG>
Någon som har en bra idé?
Det jag behöver är alltså att få alla unika kategorier ner ett steg och matcha alla element med den kategorien och placera i subnoder.
MmznMedlem sedan sep. 20034 inlägg Här är ett förslag till lösning.
/M
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes"/>
<!-- Indexera Blad1-noderna med F1 (kategorin) som "nyckel" -->
<xsl:key name="kategori" match="Blad1" use="F1"/>
<xsl:template match="NewDataSet">
<LOG>
<!-- Processa kategorierna -->
<xsl:for-each select="Blad1[generate-id() = generate-id(key('kategori', F1)[1])]">
<Kategori name ="{F1}">
<xsl:apply-templates select="key('kategori', F1)/F2"/>
</Kategori>
</xsl:for-each>
</LOG>
</xsl:template>
<xsl:template match="F2">
<Name name = "{.}">
<Data1>
<xsl:value-of select="../F3"/>
</Data1>
<xsl:apply-templates select="../F4"/>
</Name>
</xsl:template>
<xsl:template match="F4">
<Data2>
<xsl:value-of select="."/>
</Data2>
</xsl:template>
</xsl:transform>