Gunnar Bittersmann: Pseudoattribut-Knoten von PI-Knoten

Beitrag lesen

Hello out there!

Die Pseudoattribute, die vorkommen können, sind wenige und namentlich bekannt.

Müssen sie gar nicht. „Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.“ [Cheatah]

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  <xsl:output  
    xsl:method="xml"  
    xsl:encoding="UTF-8"  
    xsl:standalone="no"  
    xsl:indent="yes"  
  />  
  <xsl:template match="/">  
    <quz>  
      <xsl:apply-templates/>  
    </quz>  
  </xsl:template>  
  
  <xsl:template match="processing-instruction('foo')">  
    <foo>  
      <xsl:call-template name="getNextPseudoattribute">  
        <xsl:with-param name="string" select="current()"/>  
      </xsl:call-template>  
    </foo>  
  </xsl:template>  
  
  <xsl:template name="getNextPseudoattribute">  
    <xsl:param name="string"/>  
    <xsl:variable name="pseudoattributeName" select="normalize-space(substring-before($string, '='))"/>  
    <xsl:variable name="substringAfterEqualSign" select="normalize-space(substring-after($string, '='))"/>  
    <xsl:variable name="startsWithApos" select='starts-with($substringAfterEqualSign, "&apos;")'/>  
    <xsl:if test="starts-with($substringAfterEqualSign, '&quot;') or $startsWithApos">  
      <xsl:variable name="limiter" select="substring($substringAfterEqualSign, 1, 1)"/>  
      <xsl:variable name="substringAfterLimiter" select="substring($substringAfterEqualSign, 2)"/>  
      <xsl:variable name="pseudoattributeValue" select="substring-before($substringAfterLimiter, $limiter)"/>  
      <xsl:attribute name="{$pseudoattributeName}"><xsl:value-of select="$pseudoattributeValue"/></xsl:attribute>  
      <xsl:call-template name="getNextPseudoattribute">  
        <xsl:with-param name="string" select="substring-after($substringAfterLimiter, $limiter)"/>  
        <xsl:with-param name="alternate" select="true()"/>  
      </xsl:call-template>  
    </xsl:if>  
  </xsl:template>  
</xsl:stylesheet>

„Aber wem erzähle ich das? Dem wissend zwinkernden? Wahrscheinlich doch nur dem Archiv.“ [at]

Eklig wird’s, weil statt doppelten auch einfache Anführungszeichen stehen können

Tricky ist die Sache mit '"' und "'". Eine Maskierung hab ich nicht hinbekommen; da fiel mir nichts Besseres ein als das Ergebnis des einen Tests in der Variablen startsWithApos abzulegen. Geht das auch ohne? Lassen sich die beiden Zeilen

    <xsl:variable name="startsWithApos" select='starts-with($substringAfterEqualSign, "&apos;")'/>  
    <xsl:if test="starts-with($substringAfterEqualSign, '&quot;') or $startsWithApos">

in nur mit einem 'xsl:if' schreiben?

See ya up the road,
Gunnar

--
„Und [dieses Forum] soll […] auch ein Fachforum bleiben und kein Psychologieforum werden.“ (Kirsten Evers)