[xsl]Groeperen op attributen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • -Klimaks-
  • Registratie: Maart 2001
  • Laatst online: 19-09 15:14
Ik heb de onderstaande XML en wil daarin de elementen groeperen op categorie. Ik ben er al in geslaagd om de unieke categorieën eruit te filteren, maar het lukt me niet om de elementen te laten zien die tot deze categorie behoren. Is dit mogelijk met xsl?

De XML
XML:
1
2
3
4
5
6
<Rows>
  <Row name="Naam 1" category="A;B" />
  <Row name="Naam 2" category="B" />
  <Row name="Naam 3" category="C" />
  <Row name="Naam 4" category="A;C" />
</Rows>


Wat ik wil
code:
1
2
3
4
5
6
7
8
9
  * Category A
      - Naam 1
      - Naam 2
  * Category B
      - Naam 1
      - Naam 4
  * Category C
      - Naam 3
      - Naam 4


Wat ik al heb
XML:
1
2
3
4
5
6
7
8
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <xsl:for-each select="distinct-values(Rows/Row/tokenize(@Category,';'))">
    <xsl:value-of select="."/>
  </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

In those days spirits were brave, the stakes were high, men were REAL men, women were REAL women, and small furry creatures from Alpha Centauri were REAL small furry creatures from Alpha Centauri.
Zaphod in The Hitchhikers Guide To The Galaxy


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Kijk eens naar <xsl:for-each-group>, met dat element kun je nodes groeperen op een xpath expressie. Die expressie heb je al (staat hierboven).

Binnen <xsl:for-each-group> heb je een function current-group() die een nodeset returned met alle nodes die binnen de huidige groep vallen. Een <xsl:copy-of select="current-group()"/> zou moeten doen wat je wilt.

[ Voor 43% gewijzigd door Gerco op 18-05-2009 10:03 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • -Klimaks-
  • Registratie: Maart 2001
  • Laatst online: 19-09 15:14
Bedankt, dat werkt perfect _/-\o_

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:template match="Rows">
  <xsl:for-each-group select="Row" group-by="tokenize(@Category,';')">
    <xsl:sort  select="current-grouping-key()"/>  
    <xsl:value-of select="current-grouping-key()"/>
    <xsl:for-each select="current-group()">
      <xsl:value-of select="@Name"/></li>
    </xsl:for-each>
  </xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>

Nu nog hopen dat elke parser dit ondersteunt.

Niet dus -O- Sharepoint gebruikt XSLT 1.0... oa tokenize is niet beschikbaar.
Is dit uberhaupt mogelijk in XSLT 1.0

[ Voor 9% gewijzigd door -Klimaks- op 18-05-2009 10:22 ]

In those days spirits were brave, the stakes were high, men were REAL men, women were REAL women, and small furry creatures from Alpha Centauri were REAL small furry creatures from Alpha Centauri.
Zaphod in The Hitchhikers Guide To The Galaxy


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Er zijn in XSLT 1.0 verschillende mogelijkheden, de "Muenchian Method" heb ik weleens gebruikt en werkt goed, begrijpelijk is alleen anders :)

Zie hier voor meer info en voorbeeldcode: http://www.jenitennison.com/xslt/grouping/index.xml.

Heb je alleen je tokenize() probleem nog over. Ik geloof niet dat er in XSLT 1.0 een equivalent is, je zult mogelijk met recursieve substring() aan de slag moeten. Probleem is alleen dat er ook geen user defined functions mogelijk zijn in 1.0.

Als je een java processor had zou ik zeggen dat je een extension function kon maken die die tokenize() voor je doet, maar ik denk niet dat je dat binnen sharepoint kan gebruiken. Misschien een .NET assembly? Hier is een voorbeeld van iemand die precies dat geimplementeerd heeft in .NET: http://www.tkachenko.com/blog/archives/000014.html.

[ Voor 56% gewijzigd door Gerco op 18-05-2009 10:34 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Is er geen mogenlijkheid om de xml aan te passen? Een XML als de volgende zal een stuk makkelijker te processen zijn
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Rows> 
  <Row name="Naam 1"> 
     <Categories><Category>A</Category><Category>B</Category></Categories>
  </Row>
  <Row name="Naam 2">
      <Categories><Category>B</Category></Categories>
  </Row>
  <Row name="Naam 3"> 
     <Categories><Category>C</Category></Categories>
  </Row>
  <Row name="Naam 4"> 
     <Categories><Category>A</Category><Category>C</Category></Categories>
  </Row>
</Rows>

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • -Klimaks-
  • Registratie: Maart 2001
  • Laatst online: 19-09 15:14
XML is jammer genoeg aan te passen. Komt zo van een Sharepoint document library

In those days spirits were brave, the stakes were high, men were REAL men, women were REAL women, and small furry creatures from Alpha Centauri were REAL small furry creatures from Alpha Centauri.
Zaphod in The Hitchhikers Guide To The Galaxy


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je kan in .NET wel XSLT extension maken ( http://www.devtips.net/Codeknipsel.aspx?id=530 ), maar ik weet niet in hoeverre je binnen Sharepoint de mogenlijkheid hebt om die te gebruiken.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • -Klimaks-
  • Registratie: Maart 2001
  • Laatst online: 19-09 15:14
Woy schreef op maandag 18 mei 2009 @ 10:58:
Je kan in .NET wel XSLT extension maken ( http://www.devtips.net/Codeknipsel.aspx?id=530 ), maar ik weet niet in hoeverre je binnen Sharepoint de mogenlijkheid hebt om die te gebruiken.
Bedankt voor de tip, het lijk wel mogelijk te zijn, weer wat te lezen vandaag ;)

In those days spirits were brave, the stakes were high, men were REAL men, women were REAL women, and small furry creatures from Alpha Centauri were REAL small furry creatures from Alpha Centauri.
Zaphod in The Hitchhikers Guide To The Galaxy

Pagina: 1