webForumDet fria alternativet

Konvertering..

1 svar · 280 visningar · startad av Grollen

GrollenMedlem sedan dec. 20039 inlägg
#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.

mznMedlem sedan sep. 20034 inlägg
#2

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>
131 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)