[XSLT] Waarden uit value parsen

Pagina: 1
Acties:

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 14-02 17:55

Robtimus

me Robtimus no like you

Topicstarter
Ik moet van bepaalde XML elementen via XSLT van waarden bepaalde substrings eruit halen.

Ter voorbeeld:
Als de waarde is
code:
1
<XXXX@XXXXX.com>,\"=?US-ASCII?Q?XXXXX_=5C=28UK=5C=29?=\" <XXXXX@XXXXX.com>,\"=?US-ASCII?Q?XXXXX=2C_XXXX?=\" <XXXXX@XXXXX.com>
dan moet ik alle waarden tussen < en > hebben, dus alle XXXX@XXXX.com waarden, zodat ik hier verder mee kan (in een tabel printen).
Dit is nml een email header, en ik moet alle To adressen hebben, en dit is het enige element waar ze allemaal instaan. Ik kan de XML ook niet aanpassen omdat die aangeleverd wordt, en alleen XSLT staat tot mijn beschikking voor het aanpassen van de source XML.

Ik heb al in de specs van XSLT gekeken maar niks gevonden.
Is wat ik wil mogelijk, en zo ja hoe?

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Waarom kun je alleen XSLT gebruiken om de XML "aan te passen"?
Er zijn wel wat mogelijkheden (substring enzo) maar dat gaat je waarschijnlijk (AFAIK) veel moeite kosten om het goed eruit te peuteren.

Then again, even googlen leverde me dit op, kun je daar niks mee? Ik heb wel wat gerommeld met XSLT, maar echt "kenner" durf ik me nog niet te noemen :P

[ Voor 43% gewijzigd door RobIII op 07-09-2006 17:46 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

RobIII schreef op donderdag 07 september 2006 @ 17:41:
Waarom kun je alleen XSLT gebruiken om de XML "aan te passen"?
Er zijn wel wat mogelijkheden (substring enzo) maar dat gaat je waarschijnlijk (AFAIK) veel moeite kosten om het goed eruit te peuteren.

Then again, even googlen leverde me dit op, kun je daar niks mee? Ik heb wel wat gerommeld met XSLT, maar echt "kenner" durf ik me nog niet te noemen :P
Das XSLT 2 , dat volgens mij nog redelijke toekomstmuziek is, maar wel dichterbij mainstream gebruik komt. XSLT-1 kent geen regexps :)

Maar goed, wat je wil kan niet echt met XSLT, omdat de string die je opgeeft geen well-formed XML is. Aangezien het emailadres variabel is, kan je de tekst tussen de < en de > ook geen node laten zijn ;) . Of is dit niet het hele XML-document, maar een node daarin ? Dan zou je RobIII's substring kunnen gaan uitproberen, maar echt eenvoudig is dit inderdaad niet. :)

http://www.jenitennison.com/xslt/utilities/markup.xsl (en http://www.jenitennison.com/xslt/utilities/markup.xml voor uitleg) is een goed voorbeeld van hoeveel moeite het nu nog kost om woorden uit xml-nodes te vissen en die te replacen. Wellicht kan je het aanpassen, maar dan moet je wel goed weten wat je doet en dan moet je wel well-formed xml hebben. :)

Sundown Circus


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 14-02 17:55

Robtimus

me Robtimus no like you

Topicstarter
RobIII schreef op donderdag 07 september 2006 @ 17:41:
Waarom kun je alleen XSLT gebruiken om de XML "aan te passen"?
Omdat het deel uitmaakt van een systeem dat XML uitspuugt, inleest met een bepaalde XSLT file, en daarna als HTML laat zien in een eigen component. Het enige wat ik in dit proces kan doen is bepalen welke XSLT file er gebruikt wordt.
RedRose schreef op donderdag 07 september 2006 @ 18:07:
Maar goed, wat je wil kan niet echt met XSLT, omdat de string die je opgeeft geen well-formed XML is. Aangezien het emailadres variabel is, kan je de tekst tussen de < en de > ook geen node laten zijn ;) . Of is dit niet het hele XML-document, maar een node daarin ? Dan zou je RobIII's substring kunnen gaan uitproberen, maar echt eenvoudig is dit inderdaad niet. :)
Dit is geen element maar de tekst binnenin een element (PCDATA dus). Het XML bestand zelf is wel degelijk well formed.

Ik ga morgen eens naar jullie oplossingen kijken, en hoop dat ik er wat mee kan.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Misschien kun je dit doen met de substring-after en substring-before functies van XSLT (versie 1).
Daarmee zou je stukjes uit een lange string moeten kunnen knippen.

Kun je een voorbeeldje geven van een stukje van je XML, en wat de gewenste output zou moeten zijn?

Verwijderd

Dit doet ongevveer wat ik denk dat je wilt:
(ik heb de string die je wilt parsen in een element genaamd 'bla' gestopt)

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output type="text"/>

<xsl:template match="/bla">
  <xsl:call-template name="breek-string">
    <xsl:with-param name="list" select="."/>
  </xsl:call-template>
</xsl:template>

<xsl:template name="breek-string">
<xsl:param name="list"/>
    <xsl:variable name="helestring" select="$list"/>
    <xsl:variable name="first" select="substring-before($helestring,'&gt;')"/>
    <xsl:variable name="rest"  select="substring-after($helestring,'&gt;')"/>
    <xsl:variable name="token" select="substring-after($first,'&lt;')"/>
    Token:<xsl:value-of select="$token"/>
    <xsl:if test="(boolean($rest))">
      <xsl:text>
      </xsl:text>
      <xsl:call-template name="breek-string">
        <xsl:with-param name="list" select="$rest"/>
      </xsl:call-template>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 14-02 17:55

Robtimus

me Robtimus no like you

Topicstarter
Verwijderd schreef op vrijdag 08 september 2006 @ 12:42:
Dit doet ongevveer wat ik denk dat je wilt:
(ik heb de string die je wilt parsen in een element genaamd 'bla' gestopt)

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output type="text"/>

<xsl:template match="/bla">
  <xsl:call-template name="breek-string">
    <xsl:with-param name="list" select="."/>
  </xsl:call-template>
</xsl:template>

<xsl:template name="breek-string">
<xsl:param name="list"/>
    <xsl:variable name="helestring" select="$list"/>
    <xsl:variable name="first" select="substring-before($helestring,'&gt;')"/>
    <xsl:variable name="rest"  select="substring-after($helestring,'&gt;')"/>
    <xsl:variable name="token" select="substring-after($first,'&lt;')"/>
    Token:<xsl:value-of select="$token"/>
    <xsl:if test="(boolean($rest))">
      <xsl:text>
      </xsl:text>
      <xsl:call-template name="breek-string">
        <xsl:with-param name="list" select="$rest"/>
      </xsl:call-template>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>
Super!
Nu nog even dit in mijn bestaande XSL gaan proppen en ik ben klaar.

More than meets the eye
There is no I in TEAM... but there is ME
system specs

Pagina: 1