Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

String doorlopen in XSLT 1.0

Pagina: 1
Acties:

  • van.der.schulting
  • Registratie: Juli 2002
  • Laatst online: 09-08-2024
Miscchien hoort dit in het scripting forum thuis, maar ik vind het meer een programmeer-probleem dan een script probleem, maar als ik het mis heb kan dit topic verplaatst worden.

Het probleem
Met behulp van XSLT wil ik in een bestaande applicatie een String inlezen en de pagina’s in deze String printen. Stel bijvoorbeeld, ik heb de String “1,2,3-8”; dan wil ik dus pagina 1, 2, 3 tot en met 8 printen.

Opzich niet zo’n moeilijk probleem als je gebruik maakt van XSLT 2.0. Ik kan echter alleen XSLT 1.0 gebruiken, omdat Java alleen XSLT 1.0 ondersteund. OK, met het Saxon-framework schijnt het wel te kunnen om XSLT 2.0 in te lezen. Dit wil ik echter niet doen, omdat ik ten eerste geen ervaring heb met Saxon en daarnaast bang ben de applicatie te vernielen.

Functies als tokenize en replace kan ik dus niet gebruiken, deze zijn immers onderdeel van XSLT 2.0. XSLT heeft alleen de mogelijkheid tot for-each loops als het gaat om nodes.
Dit maakt het dan ook extreem lastig; dat ik geen beschikking heb over ‘normale’ loops en functies als tokenize.

Ik heb twee vragen:
1. Wie kent een algoritme om bovengenoemde ‘print-String’ te implementeren?
2. Wie kan mij een algoritme geven om mbv XSLT 1.0 bovengenoemde ‘print-String’ te implementeren?

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Heeft de java xslt processor geen mogelijkheid tot callbacks. In .NET heb je de XsltArgumentList waarmee je custom class instancies aan een urn (namespace) kunt koppelen. Als je dan eem methode schrijft welke als input een string krijgt maar als output een XmlNodeList dan kun je de normale xsl:for-each gebruiken.

Zo'n fragment kan er zo uitzien:
XML:
1
2
3
4
5
6
7
8
9
10
<RequestedPages>
  <Page>1</Page>
  <Page>3</Page>
  <Page>4</Page>
  <Page>5</Page>
  <Page>6</Page>
  <Page>7</Page>
  <Page>8</Page>
  <Page>2</Page>
</RequestedPages>


De bijhorende xslt:
XML:
1
2
3
4
5
6
7
8
9
<xsl:for-each select="MyObject:ParsePageString(//RequestedPages/text())" />
  <xsl:sort select="text()" data-type="number" />
  <xsl:choose>
    <xsl:when test="text() = '1' "><xsl:call-template name="page_1" /></xsl:when>
    <xsl:when test="text() = '2' "><xsl:call-template name="page_1" /></xsl:when>
    ...
    <xsl:when test="text() = '10' "><xsl:call-template name="page_1" /></xsl:when>
  </xsl:choose>
</xsl:for-each>


In het xsl:stylesheet element moet je daarna nog het volgende attribute opnemen:
xmlns:MyObject="urn:my-printing-control"

If it isn't broken, fix it until it is..


  • redfox314
  • Registratie: December 2004
  • Laatst online: 07-11 14:35
Ik begrijp je probleem niet helemaal.
Je hebt een string van de vorm "1,2,3-8" deze geeft aan welke pagina's je uit een xml-document wilt printen.
Je wilt dit doen door een xslt transformatie te gebruiken.
Ik zie niet in hoe je aan een xml document a priori een paginering kan toekennen.
Welke data op welke pagina terecht komt is pas na transformatie bekend.

  • van.der.schulting
  • Registratie: Juli 2002
  • Laatst online: 09-08-2024
redfox314 schreef op donderdag 08 mei 2008 @ 14:34:
Ik begrijp je probleem niet helemaal.
Je hebt een string van de vorm "1,2,3-8" deze geeft aan welke pagina's je uit een xml-document wilt printen.
Je wilt dit doen door een xslt transformatie te gebruiken.
Ik zie niet in hoe je aan een xml document a priori een paginering kan toekennen.
Welke data op welke pagina terecht komt is pas na transformatie bekend.
Zie het als volgt:
De string 1,2,3-8 geeft aan dat voor de pagina's 1,2,3 tot en met 8 bepaalde content geparsed met worden. Dus voor de pagina's 1,2, 3 tot en met 8 wil ik de node '<xsl:call-template>' aanroepen met bepaalde parameters.

Het probleem zit hem echter in de combi van het feit dat ik geen beschikking heb over loopsen functies als tokenize kan ik ook niet gebruiken, immers zit die alleen in XSLT 2.

  • van.der.schulting
  • Registratie: Juli 2002
  • Laatst online: 09-08-2024
Niemand_Anders schreef op donderdag 08 mei 2008 @ 14:23:
Heeft de java xslt processor geen mogelijkheid tot callbacks. In .NET heb je de XsltArgumentList waarmee je custom class instancies aan een urn (namespace) kunt koppelen. Als je dan eem methode schrijft welke als input een string krijgt maar als output een XmlNodeList dan kun je de normale xsl:for-each gebruiken.

Zo'n fragment kan er zo uitzien:
XML:
1
2
3
4
5
6
7
8
9
10
<RequestedPages>
  <Page>1</Page>
  <Page>3</Page>
  <Page>4</Page>
  <Page>5</Page>
  <Page>6</Page>
  <Page>7</Page>
  <Page>8</Page>
  <Page>2</Page>
</RequestedPages>


De bijhorende xslt:
XML:
1
2
3
4
5
6
7
8
9
<xsl:for-each select="MyObject:ParsePageString(//RequestedPages/text())" />
  <xsl:sort select="text()" data-type="number" />
  <xsl:choose>
    <xsl:when test="text() = '1' "><xsl:call-template name="page_1" /></xsl:when>
    <xsl:when test="text() = '2' "><xsl:call-template name="page_1" /></xsl:when>
    ...
    <xsl:when test="text() = '10' "><xsl:call-template name="page_1" /></xsl:when>
  </xsl:choose>
</xsl:for-each>


In het xsl:stylesheet element moet je daarna nog het volgende attribute opnemen:
xmlns:MyObject="urn:my-printing-control"
Thanks, dit verloopt voorspoedig. Ik doe de implementatie in Java.
Nu heb ik een volgende probleem: een Node als <extent>1,2,3-8</extent> kan ik nu omzetten.
Ik zou moeten krijgen:
<extent>1</extent>
<extent>2</extent>
<extent>3</extent>
<extent>4</extent>
<extent>5</extent>
<extent>6</extent>
<extent>7</extent>
<extent>8</extent>

Ik krijg echter:
<extent>8</extent>

Dit is logisch, want ik doe telkens parentNode.appendChild(newChild)
Immers als de newChild al bestaat wordt hij overschreven. (zo staat in de API van Java).

Ik heb een merthode gevonden 'insertBefore', tmaar die doet hetzelfde als appendNode; eerst verwijderen.
Ik kan dus geen geschikte methode vinden....wie weet hoe dat moet? Hoe moet ik twee keer dezeldfde Child toevoegen na elkaar? De methode AppendChild en insertBefore werkt iig niet.

[ Voor 8% gewijzigd door van.der.schulting op 08-05-2008 17:05 ]


  • van.der.schulting
  • Registratie: Juli 2002
  • Laatst online: 09-08-2024
van.der.schulting schreef op donderdag 08 mei 2008 @ 16:51:
[...]


Thanks, dit verloopt voorspoedig. Ik doe de implementatie in Java.
Nu heb ik een volgende probleem: een Node als <extent>1,2,3-8</extent> kan ik nu omzetten.
Ik zou moeten krijgen:
<extent>1</extent>
<extent>2</extent>
<extent>3</extent>
<extent>4</extent>
<extent>5</extent>
<extent>6</extent>
<extent>7</extent>
<extent>8</extent>

Ik krijg echter:
<extent>8</extent>

Dit is logisch, want ik doe telkens parentNode.appendChild(newChild)
Immers als de newChild al bestaat wordt hij overschreven. (zo staat in de API van Java).

Ik heb een merthode gevonden 'insertBefore', tmaar die doet hetzelfde als appendNode; eerst verwijderen.
Ik kan dus geen geschikte methode vinden....wie weet hoe dat moet? Hoe moet ik twee keer dezeldfde Child toevoegen na elkaar? De methode AppendChild en insertBefore werkt iig niet.
Niemand??

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Volgens mij AppendChild mag alleen een node overschrijven als deze dezelfde reference (pointer) heeft. Of kun je in Java geen boom in een loop opbouwen? Ik ben verder geen held in Java, maar je hoeft toch helemaal niet de lijst via een xml document op te bouwen? Kun je niet gewoon een StringBuilder class gebruiken en het xml fragment als string opbouwen. Java vast wel een mogelijkheid om een xml string om te zetten naar een xml tree.

If it isn't broken, fix it until it is..


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Je kunt in XSLT recursief itereren, bijvoorbeeld over jouw string. Dus zoiets:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
- root('1,2,3-6')
  - range('1', '2,3-6')
    - page('1')
    - range('2', '3-6')
      - page('2')
      - range('3-6')
        - multiple('3', '6')
          - page('3')
          - multiple('4', '6')
            - page('4')
            - multiple('5', '6')
              - page('5')
              - multiple('6', '6')
                - page('6')


Best te doen; het doet denken aan functioneel programmeren, als dat je wat zegt.

Rustacean


  • van.der.schulting
  • Registratie: Juli 2002
  • Laatst online: 09-08-2024
Manuzhai schreef op vrijdag 09 mei 2008 @ 16:27:
Je kunt in XSLT recursief itereren, bijvoorbeeld over jouw string. Dus zoiets:

.......

Best te doen; het doet denken aan functioneel programmeren, als dat je wat zegt.
Het concept van recursief programmeren ken ik. Ik ga eens kijken of ik dit kan implementeren. Thnx.

[ Voor 33% gewijzigd door van.der.schulting op 12-05-2008 14:57 ]

Pagina: 1