web 2.0

Lessons Learned: XMLWriter correct HTML elements laten sluiten

Vandaag had ik ruzie met het maken van HTML op basis van XML met een XSL stylesheet. De XMLTextWriter zorgde er voor dat lege HTML elements afgesloten werden als XML elementen. Een div werd als <div/> afgesloten inplaats van <div></div> dit zorgde voor slechte HTML en daardoor pagina's die er niet uitzagen. Het probleem zat in de XMLTextwriter van .Net. Deze heeft een setting OutputMethod die standaard op XML staat waardoor de elementen self closing zijn. Deze OutputMethod moet gezet worden op HTML, deze setting is echter internal en daardoor niet te wijzigen. 

De oplossing hievoor moet gezocht worden in het gebruiken van de settings die gezet worden in de XSL. 

In de XSL specificeer je de output methode

 

<xsl:output method="html" indent="yes" omit-xml-declaration="yes" />

 

In de code kunnen deze settings vervolgens weer overgenomen worden

 

XslCompiledTransform transformer = new XslCompiledTransform();
transformer.Load(xslFile);
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(xmlContent);
//Hier worden settings voor de HTML output methode overgenomen
XmlTextWriter xtw = XmlWriter.Create(htmlFile, transformer.OutputSettings);
transformer.Transform(xdoc.CreateNavigator(), xtw);

 

Met dank aan tek-tips.

Lessons Learned: XML processing instruction toevoegen via XSL

Vandaag moest ik via een XSL template een XML processing instruction toevoegen. Dit werkte niet om het "gewoon" als inhoud van een template toe te voegen, dit moest via een <xsl:processing-instruction>

 

Gewenste situatie

 

<element>
<!-- hier moest een processing instruction komen, 
in dit geval voor het einde van een pagina -->
<?xpp ep?>
</element>

 

 

Template:

 

<xsl:template match="pagebreak">
  <xsl:processing-instruction name="xpp">ep</xsl:processing-instruction>
</xsl:template>

 

En andersom

 

<xsl:template match="processing-instruction('xpp')[.='ep']">
      <pagebreak/>
  </xsl:template>