[XML/XSLT] Nodes kopieren in een attribuut

Pagina: 1
Acties:

  • Tom-Eric
  • Registratie: Oktober 2001
  • Laatst online: 25-03-2025
Ik zit nu al een tijdje te werken met XML en XSLT, maar blijf toch steeds op 1 probleem stuiten. Ik heb een XML document dat er bijvoorbeeld zo uit ziet:
XML:
1
2
3
4
<?xml version="1.0"?>
<document>
    <element>Lorem ipsum <element /></element>
</document>

en wat ik graag wil krijgen is:
XML:
1
2
3
4
<?xml version="1.0"?>
<document>
    <content value="&lt;element&gt;Lorem ipsum &lt;element /&gt;&lt;element&gt;" />
</document>

of, bijvoorbeeld voor een textarea:
HTML:
1
<textarea>&lt;element&gt;Lorem ipsum &lt;element /&gt;&lt;element&gt;</textarea>


Bij een textarea heb ik het nu gedeeltelijk opgelost door gebruik te maken van CDATA (dit werkt in XHTML, en dus kan ik gewoon de hele nodeset in CDATA blokken plaatsen), maar nu wil ik gebruik maken van XStandard, en die vereist dat je de content in een attribuut plaatst.

Ik heb al diverse dingen geprobeerd, zoals het gebruik maken van <xsl:attribute> en daar de nodeset in kopieren, het plaatsen van de nodeset in een variable en deze kopieren/plakken, maar het gewenste effect wordt niet bereikt.

i76 | Webdesignersgids | Online Gitaarlessen & Muziekwinkels


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Hm, ik vraag me af of dit wel zo netjes is, wat je wilt maar goed... feitelijk komt het er op neer dat je de notie dat de content van het attribuut xml is negeren en gewoon content -no matter what- in de de attributen wilt zetten.

Ik denk dat je dan het makkelijkst de nodes allemaal (recursief) af kunt wandelen door een call-template te doen, en in die template de nodeset reproduceert, maar dan als CDATA in plaats van daadwerkelijke elementen.

edit:
en de eerste call-template natuurlijk in een xsl:attribute

[ Voor 8% gewijzigd door drm op 21-10-2004 12:14 ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Tom-Eric
  • Registratie: Oktober 2001
  • Laatst online: 25-03-2025
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="xsl"
>
    <xsl:template name="encode">
        <xsl:param name="nodes" select="''" />
        <xsl:apply-templates mode="escape" select="$nodes" />
    </xsl:template>
    
    <xsl:template match="node()" mode="escape">&lt;<xsl:value-of select="local-name()" /><xsl:apply-templates select="@*" mode="escape" /><xsl:choose><xsl:when test=".//*|text()">&gt;</xsl:when><xsl:otherwise>/&gt;</xsl:otherwise></xsl:choose><xsl:if test=".//*|text()"><xsl:apply-templates mode="escape" />&lt;/<xsl:value-of select="local-name()" />&gt;</xsl:if></xsl:template>

    <xsl:template match="@*" mode="escape">
        <xsl:text> </xsl:text><xsl:value-of select="local-name()" />="<xsl:value-of select="." />"
    </xsl:template>
    
    <xsl:template match="text()" mode="escape"><xsl:value-of select="." /></xsl:template>
</xsl:stylesheet>

Dit werkt inderdaad, alleen helaas verlies ik op deze manier wel whitespace tussen nodes.

i76 | Webdesignersgids | Online Gitaarlessen & Muziekwinkels