Taken for granted that a microformat is a way to embed data inside xhtml
presentation, last night I was wondering if really it was unavoidable to
have so many different formats with complex rules and nasty exceptions.

>From this thinking I've tried to develop a little proposal to embed
arbitrary xml data inside xhtml and that may be extracted easily and
without ambiguities while leaving total freedom on data presentation.

My main interest was something similar to hcalendar to overcome current
limitations of this microformat wrt params.

This is the reason why you find that the attached test is for calendar
data, but my proposal should be general enough to permit embedding of
*any* xml data.

The attached stylesheet is for extraction of data in xml form, but it
might be easily modified to extract data in xCalendar or iCalendar
format (that maps 1:1 to xml).

-- 
Abramo Bagnara                       mailto:[EMAIL PROTECTED]

Opera Unica                          Phone: +39.0546.656023
Via Emilia Interna, 140
48014 Castel Bolognese (RA) - Italy
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
<html xmlns="http://www.w3.org/1999/xhtml";>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <title>Test</title>
    <link type="text/css" rel="stylesheet" href="../../html/project.css" />
  </head>
  <body class="xx:vcalendar=">
    <div class="xx:vtodo=">
      <h2 class="xx:summary">Task di test</h2>
      <div>
        <span class="header">Location: </span>
        <span class="xx:location">Location</span>
      </div>
      <div>
        <b>Due date: </b>
        <abbr class="xx:[EMAIL PROTECTED]" title="20051130">30-11-2005</abbr>
      </div>
      <div class="xx:description">
        <div class="ancestor-summary">Test</div>
        <ol class="disc">
          <li>
            <div class="node-summary">
              <a href="edit:/u/dothert/data/abramo/test.txt##18">Task di test</a>
            </div>
            <div class="node-location">Location</div>
            <div class="node-description">
              <p>Descrizione sotto divisa in paragrafi di una certa lunghezza di una
certa lunghezza di una certa <b>lunghezza</b> di una certa lunghezza di una
certa lunghezza di una certa lunghezza</p>
              <p>Descrizione sotto divisa in paragrafi di una certa lunghezza di una
certa lunghezza di una certa lunghezza di una certa lunghezza di una
certa lunghezza di una certa lunghezza</p>
              <p>Descrizione sotto divisa in paragrafi di una certa lunghezza di una
certa lunghezza di una certa lunghezza di una certa lunghezza di una
certa lunghezza di una certa lunghezza</p>
            </div>
          </li>
        </ol>
        <p>Descrizione della deadline</p>
        <p>Descrizione sotto divisa in paragrafi di una certa lunghezza di una
certa lunghezza di una certa lunghezza di una certa lunghezza di una
certa lunghezza di una certa lunghezza</p>
        <p>Descrizione sotto divisa in paragrafi di una certa lunghezza di una
certa lunghezza di una certa lunghezza di una certa lunghezza di una
certa lunghezza di una certa lunghezza</p>
      </div>
      <div><span class="header">Categories: </span><span class="xx:categories">a</span>, <span class="xx:categories">a:b</span>, <span class="xx:categories">a:b:c</span>, <span class="xx:categories">ismaele</span>, <span class="xx:categories">ismaele:opt</span>, <span class="xx:categories">licia</span>, <span class="xx:categories">licia:opt</span>, <span class="xx:categories">abramo</span>, <span class="xx:categories">abramo:cha</span>, <span class="xx:categories">test</span>, <span class="xx:categories">abramo</span></div>
      <div>
        <span class="header">Priority: </span>
        <abbr class="xx:[EMAIL PROTECTED]" title="0">not specified</abbr>
      </div>
      <div>
        <span class="header">Presidente: </span>
        <span class="xx:attendee=">
          <abbr class="xx:@[EMAIL PROTECTED]" title="chair"></abbr>
          <a class="xx:@cn xx:[EMAIL PROTECTED]" href="mailto:[EMAIL PROTECTED]">Abramo Bagnara</a>
        </span>
      </div>
      <div>
	<span class="header">Partecipanti opzionali: </span>
	<span class="xx:attendee=">
	  <abbr class="xx:@[EMAIL PROTECTED]" title="opt-participant"></abbr>
          <a class="xx:@cn xx:[EMAIL PROTECTED]" href="mailto:">Ismaele Bagnara</a>
        </span>, <span class="xx:attendee="><abbr class="xx:@[EMAIL PROTECTED]"
	title="opt-participant"></abbr>
      <a class="xx:@cn xx:[EMAIL PROTECTED]" href="[EMAIL PROTECTED]">Licia Tabanelli</a></span></div>
    </div>
  </body>
</html>
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

<!--
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  xmlns:dyn="http://exslt.org/dynamic";
  extension-element-prefixes="dyn">
-->

<!--
  Extract xml embedded in xhtml.
  First draft.

  Copyright 2005 Abramo Bagnara <[EMAIL PROTECTED]>
-->

<xsl:output method="xml"
  indent="yes"/>

<xsl:variable name="prefix" select="' xx:'"/>

<!--
<xsl:template name="dyn-evaluate">
  <xsl:param name="xpath"/>
  <xsl:for-each select="dyn:evaluate($xpath)">
    <xsl:value-of select="."/>
  </xsl:for-each>
</xsl:template>
-->

<xsl:template name="dyn-evaluate">
  <xsl:param name="xpath"/>
  <xsl:choose>
    <xsl:when test="$xpath='.//text()'">
      <xsl:for-each select=".//text()">
        <xsl:value-of select="."/>
      </xsl:for-each>
    </xsl:when>
    <xsl:when test="$xpath='text()'">
      <xsl:for-each select="text()">
        <xsl:value-of select="."/>
      </xsl:for-each>
    </xsl:when>
    <xsl:when test="starts-with($xpath,'@')">
      <xsl:value-of select="@*[name()=substring($xpath,2)]"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:for-each select="*[name()=$xpath]">
        <xsl:value-of select="."/>
      </xsl:for-each>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="evaluate">
  <xsl:param name="xpath"/>
  <xsl:if test="$xpath != ''">
    <xsl:call-template name="dyn-evaluate">
      <xsl:with-param name="xpath" select="$xpath"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>

<!--
class : destination
      | destination '=' source
      ;

prefix : 'xx:' ;

destination : name
            | '@' name
            ;

source : ''
       | xpath
       ;
-->

<xsl:template name="extract">
  <xsl:param name="classes"/>
  <xsl:variable name="c" select="substring-after(concat(' ',$classes),$prefix)"/>
  <xsl:choose>
    <xsl:when test="$c = ''">
      <xsl:apply-templates/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:variable name="class" select="substring-before(concat($c,' '),' ')"/>
      <xsl:variable name="destination" select="substring-before(concat($class,'='),'=')"/>
      <xsl:variable name="source">
        <xsl:choose>
          <xsl:when test="contains($class,'=')">
            <xsl:value-of select="substring-after($class,'=')"/>
          </xsl:when>
          <xsl:otherwise>.//text()</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:choose>
        <xsl:when test="$destination = ''">
          <xsl:call-template name="evaluate">
            <xsl:with-param name="xpath" select="$source"/>
          </xsl:call-template>
          <xsl:call-template name="extract">
            <xsl:with-param name="classes" select="substring-after($c,' ')"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="starts-with($destination,'@')">
          <xsl:attribute name="{substring($destination,2)}">
            <xsl:call-template name="evaluate">
              <xsl:with-param name="xpath" select="$source"/>
            </xsl:call-template>
          </xsl:attribute>
          <xsl:call-template name="extract">
            <xsl:with-param name="classes" select="substring-after($c,' ')"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
          <xsl:element name="{$destination}">
            <xsl:call-template name="evaluate">
              <xsl:with-param name="xpath" select="$source"/>
            </xsl:call-template>
            <xsl:call-template name="extract">
              <xsl:with-param name="classes" select="substring-after($c,' ')"/>
            </xsl:call-template>
          </xsl:element>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="[EMAIL PROTECTED]">
  <xsl:call-template name="extract">
    <xsl:with-param name="classes" select="@class"/>
  </xsl:call-template>
</xsl:template>

<xsl:template match="text()"/>

</xsl:stylesheet>
_______________________________________________
microformats-discuss mailing list
[email protected]
http://microformats.org/mailman/listinfo/microformats-discuss

Reply via email to