[cocoon] gebruiken van disable-output-escaping

Pagina: 1
Acties:

  • cveld
  • Registratie: December 1999
  • Laatst online: 12-02-2025

cveld

Kennistechnoloog

Topicstarter
Omdat disable-output-escaping (d-o-e) kan veroorzaken dat de resulttree niet meer wellformed is wordt er in de pipeline door de transformer een processinginstructie ingevoegd:

code:
1
2
3
4
    <xsl:text disable-output-escaping="yes">&lt;</xsl:text>
    <xsl:text>!--</xsl:text>
    <xsl:text>[if gte mso 9]</xsl:text>
    <xsl:text disable-output-escaping="yes">&gt;</xsl:text>


resulteert in (ik gebruik Saxon 7.9.1 of Saxon 8.0):
code:
1
2
3
4
<?javax.xml.transform.disable-output-escaping >&lt;
    <?javax.xml.transform.enable-output-escaping >
!--[if gte mso 9]<?javax.xml.transform.disable-output-escaping >&gt;
    <?javax.xml.transform.enable-output-escaping >

Michael Kay schrijft: "In 90% van de gevallen heb je d-o-e helemaal niet nodig, daarom wordt het in Cocoon niet ondersteund".

Het lijkt er echter op dat ik het wezenlijk nodig heb hier! Wat is namelijk het geval? Ik wil in het resultaat een resulttree in commentaar genereren:
code:
1
2
3
4
5
<!--
    <boom>
    ... content ...
    </boom>
-->

Als ik echter in xslt het volgende specificeer:
code:
1
2
3
4
5
    <xsl:comment>
    <boom>
    ... content ...
    </boom>
    </xsl:comment>


heeft dat als resultaat:
code:
1
<!--... content ...-->

De starttag en endtag <boom> zijn er niet meer! Dit komt omdat een copy-of-bewerking terugvalt op het gedrag van value-of als het resultaat niet in een element wegschreven wordt, maar bijv. in een comment-node.
Dus moet ik wel d-o-e gebruiken om een resulttree weg te schrijven binnen commentaar!

Hoe krijg ik in Cocoon voor elkaar dat de processing-instructions tijdens serialisatie daadwerkelijk opgevolgd worden en dat &lt; en &gt; inderdaad zullen resulteren in < en >?
De gemakkelijkste oplossing lijkt mij een serializer te vinden die die processing instructions begrijpt en verwerkt. Kan ik Saxon inzetten om te serialiseren, zo ja, hoe? En heeft dat het gewenste effect?

Kennistechnoloog


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Is het niet handiger om de xsl:comment inhoud te escapen?
code:
1
2
3
4
5
<xsl:comment>
    &lt;boom&gt;
    ... content ...
    &lt;/boom&gt;
</xsl:comment>

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • cveld
  • Registratie: December 1999
  • Laatst online: 12-02-2025

cveld

Kennistechnoloog

Topicstarter
Wat ik doe is met een <xsl:copy-of> een stukje boom kopiëren. Als ik deze boom kan escapen (dus inderdaad de < en > vervangen door &lt; en &gt;) ipv dat de xslt-processor een value-of-bewerking overheen gooit, dat is dan ook prima natuurlijk. Is dit mogelijk?

De xslt-processor vervangt binnen een comment-node weer netjes de &lt; en &gt; door < en >, dus jouw oplossingsrichting bevalt me wel!

Kennistechnoloog


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Humz, ik wist niet dat de comment inhoud ook afhing van de input. Dat maakt het inderdaad wat lastiger, maar het blijft toch echt het netste om te proberen gelijk het commentaar goed op te leveren ipv allerlei andere ranzige trucs. Voor het serializeren van een boom naar een string bestaan, voor zover ik weet, geen standaard functies, ook niet in EXSLT. Er zijn misschien nog wel twee eenvoudige oplossingen.

(1) Je zou in Java (het immers Cocoon) een XSLT uitbreiding kunnen implementeren die een gegeven boom serializeert naar een string. Je implementeert dan dus zelf de ontbrekende functie in Java code. De XSLT processor zorgt verder (als het goed is) wel voor de escaping van je uitvoer. XSLT extenties implementeren is uiterst eenvoudig, maar je verbind je dan helaas meestal wel aan een specifieke processor.

(2) De andere oplossing kan is puur XSLT: je zou een identity template (vrij bekend, ook wel eens hier besproken ook GoT) kunnen aanpassen zodat het geen XML maar tekst oplevert. Dit komt in feite op hetzelfde neer als serializatie in Java, maar je implementeert de serializatie in dit geval eigenlijk zelf in XSLT.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment