Opis
Projekt zakończony
Szymon Deja szydej@gmail.com
Translacja XTTML do innych formatów z użyciem XSLT. : ontologie (OWL), graphviz
Spotkania
080311
080318
próba translacji
XTTML20 do graphviza
080401
080408
080415
080429
080527
Projekt
Reprezentajca tabel w graphizie :
digraph structs {
node [shape=record];
struct1 [shape=record,label="<f0> left|<f1> mid\ dle|<f2> right"];
struct2 [shape=record,label="<f0> one|<f1> two"];
struct3 [shape=record,label="hello\nworld |{ b |{c|<here> d|e}| f}| g | h"];
struct1 -> struct2;
struct1 -> struct3;
}
Translacja XTTML20 do graphviza
<xsl:stylesheet version="1.0" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="doc chapter section"/>
<xsl:output indent="yes" method="xml"/>
<xsl:template match="/">
<graph xmlns="http://www.martin-loetzsch.de/DOTML">
<xsl:for-each select="/xttml/xtt_list_table/xtt_table">
<xsl:variable name="tabela" select="@name"/>
<record>
<xsl:for-each select="./column_attributes/ca">
<xsl:variable name="col" select="position()"/>
<record>
<xsl:variable name="kolumna" select="."/>
<xsl:element name="node">
<xsl:attribute name="id">555</xsl:attribute>
<xsl:attribute name="label">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:element>
<xsl:for-each select="../../row">
<xsl:variable name="i" select="position()"/>
<xsl:for-each select="cell[$col]">
<xsl:variable name="id">
<xsl:value-of select="$tabela"/>
<xsl:text>_</xsl:text>
<xsl:value-of select="$i"/>
<xsl:text>_</xsl:text>
<xsl:value-of select="$kolumna"/>
</xsl:variable>
<xsl:variable name="label" select="translate(translate(@content,'{','('),'}',')')"/>
<xsl:choose>
<xsl:when test="./@operator='e'">
<node id="{$id}" label="= {$label}"/>
</xsl:when>
<xsl:when test="./@operator='ne'">
<node id="{$id}" label="=! {$label}"/>
</xsl:when>
<xsl:when test="./@operator='g'">
<node id="{$id}" label="gt; {$label}"/>
</xsl:when>
<xsl:when test="./@operator='ge'">
<node id="{$id}" label="gt;= {$label}"/>
</xsl:when>
<xsl:when test="./@operator='l'">
<node id="{$id}" label="lt; {$label}"/>
</xsl:when>
<xsl:when test="./@operator='le'">
<node id="{$id}" label="lt;= {$label}"/>
</xsl:when>
<xsl:when test="./@operator='min'">
<node id="{$id}" label="min {$label}"/>
</xsl:when>
<xsl:when test="./@operator='in'">
<node id="{$id}" label="in {$label}"/>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:for-each>
</record>
</xsl:for-each>
</record>
</xsl:for-each>
<xsl:for-each select="//xtt_list_connections/xtt_connection">
<xsl:variable name="tabfrom" select="@source_table_name"/>
<xsl:variable name="tabto" select="@destination_table_name"/>
<xsl:variable name="sr" select="@source_row"/>
<xsl:variable name="dr" select="@destination_row"/>
<xsl:variable name="srow" select="//xtt_table[@name = $tabfrom]/column_attributes/ca[last()]"/>
<xsl:variable name="drow" select="//xtt_table[@name = $tabto]/column_attributes/ca[1]"/>
<xsl:variable name="from">
<xsl:value-of select="$tabfrom"/>
<xsl:text>_</xsl:text>
<xsl:value-of select="$sr + 1"/>
<xsl:text>_</xsl:text>
<xsl:value-of select="$srow"/>
</xsl:variable>
<xsl:variable name="to">
<xsl:value-of select="$tabto"/>
<xsl:text>_</xsl:text>
<xsl:value-of select="$dr + 1"/>
<xsl:text>_</xsl:text>
<xsl:value-of select="$drow"/>
</xsl:variable>
<xsl:element name="edge">
<xsl:attribute name="from">
<xsl:value-of select="$from"/>
</xsl:attribute>
<xsl:attribute name="to">
<xsl:value-of select="$to"/>
</xsl:attribute>
<xsl:attribute name="constraint">
<xsl:text>false</xsl:text>
</xsl:attribute>
<xsl:attribute name="tailport">
<xsl:text>:e</xsl:text>
</xsl:attribute>
<xsl:attribute name="headport">
<xsl:text>:w</xsl:text>
</xsl:attribute>
</xsl:element>
</xsl:for-each>
</graph>
</xsl:template>
</xsl:stylesheet>
080401
xttml → svg (XSL) xttml2svg.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" xmlns:fn ="http://www.w3.org/2005/02/xpath-functions">
<xsl:variable name="temp" />
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" />
<xsl:template match="/">
<svg
xmlns="http://www.w3.org/2000/svg"
version="1.0"
width="297mm"
height="420mm"
id="svg2">
<xsl:apply-templates select="/xttml/xtt_list_table/xtt_table" />
<xsl:apply-templates select="/xttml/xtt_list_connections/xtt_connection" />
</svg>
</xsl:template>
<xsl:template match="//xtt_table">
<xsl:variable name="xpos" select=" ./localization/@xpos "/>
<xsl:variable name="ypos" select="./localization/@ypos "/>
<xsl:variable name="header" select="./localization/@header_height "/>
<xsl:for-each select="column_attributes/ca">
<xsl:variable name="col" select="position()"/>
<xsl:variable name="x" select=" $xpos + sum(../../localization/col_widths/cw[ position() < $col])"/>
<xsl:variable name="y" select=" $ypos"/>
<xsl:variable name="xdl" select="../../localization/col_widths/cw[$col]"/>
<rect x="{$x}" y="{$y -$header}" width="{$xdl}" height="{$header}"
style="fill:none;stroke:#0080c0;"/>
<text x="{$x}" y="{$y} "
style="font-size:10pt;font-weight:bold;text-anchor:start;font-family:Courier New;">
<xsl:value-of select="."/></text>
</xsl:for-each>
<xsl:for-each select="row">
<xsl:variable name="row" select="position()"/>
<xsl:for-each select="cell">
<xsl:variable name="col" select="position()"/>
<xsl:variable name="x" select=" $xpos + sum(../../localization/col_widths/cw[ position() < $col])"/>
<xsl:variable name="y" select=" $ypos +$header+ sum(../../localization/nrow_heights/rh[ position() < $row])"/>
<xsl:variable name="xdl" select="../../localization/col_widths/cw[$col]"/>
<xsl:variable name="ydl" select="../../localization/nrow_heights/rh[$row]"/>
<rect x="{$x}" y="{$y -$ydl}" width="{$xdl}" height="{$ydl}"
style="fill:none;stroke:#0080c0;"/>
<text x="{$x}" y="{$y} "
style="font-size:10pt;font-weight:normal;text-anchor:start;font-family:Courier New;">
<xsl:choose>
<xsl:when test="./@operator='e'">
<xsl:text>=</xsl:text>
</xsl:when>
<xsl:when test="./@operator='ne'">
<xsl:text>!=</xsl:text>
</xsl:when>
<xsl:when test="./@operator='g'">
<xsl:text>></xsl:text>
</xsl:when>
<xsl:when test="./@operator='ge'">
<xsl:text>>=</xsl:text>
</xsl:when>
<xsl:when test="./@operator='l'">
<xsl:text> < </xsl:text>
</xsl:when>
<xsl:when test="./@operator='le'">
<xsl:text> <= </xsl:text>
</xsl:when>
<xsl:when test="./@operator='min'">
<xsl:text> min </xsl:text>
</xsl:when>
<xsl:when test="./@operator='in'">
<xsl:text> in </xsl:text>
</xsl:when>
</xsl:choose>
<xsl:text> </xsl:text>
<xsl:value-of select="@content"/></text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
<xsl:template match="//xtt_connection">
<xsl:variable name="pozycja" select=" position() "/>
<xsl:variable name="ile" select=" last() "/>
<xsl:variable name="stab" select="@source_table_name"/>
<xsl:variable name="dtab" select="@destination_table_name"/>
<xsl:variable name="srow" select="@source_row +1 "/>
<xsl:variable name="drow" select="@destination_row +1"/>
<xsl:variable name="x1" select=" /xttml/xtt_list_table/xtt_table[@name = $stab]/localization/@xpos + sum(/xttml/xtt_list_table/xtt_table[@name = $stab]/localization/col_widths/cw[ position() < last()+1])"/>
<xsl:variable name="y1" select=" /xttml/xtt_list_table/xtt_table[@name = $stab]/localization/@ypos +/xttml/xtt_list_table/xtt_table[@name = $stab]/localization/@header_height +
sum(//xtt_table[@name = $stab]/localization/nrow_heights/rh[ position() < $srow ]) -number( ( //xtt_table[@name = $stab]/localization/nrow_heights/rh[ $srow ])* 0.5)"/>
<xsl:variable name="x2" select=" /xttml/xtt_list_table/xtt_table[@name = $dtab]/localization/@xpos "/>
<xsl:variable name="y2" select=" /xttml/xtt_list_table/xtt_table[@name = $dtab]/localization/@ypos +/xttml/xtt_list_table/xtt_table[@name = $dtab]/localization/@header_height +
sum(//xtt_table[@name = $dtab]/localization/nrow_heights/rh[ position() < $drow]) - number( //xtt_table[@name = $dtab]/localization/nrow_heights/rh[ $drow] *0.5)"/>
<xsl:variable name="x" select="number((($x2 - $x1) div ($ile + 1)) *($pozycja) +$x1 )"/>
<xsl:variable name="y" select=" last() "/>
<polyline points="{$x1},{$y1},{$x2},{$y2}"
style="fill:white;stroke:red;stroke-width:1"/>
</xsl:template>
</xsl:stylesheet>
svg
xalan
java org.apache.xalan.xslt.Process -in thermostat2.0.xml -xsl xttml2svg.xsl
Firefox tez sobier radzi z tralnslacja pliku (musi byc dostepny plik xtt2svg.xsl) : thermostat.xml
Saxon
java net.sf.saxon.Transform -s:source -xsl:stylesheet -o:output
Sprawozdanie
Celem projektu było stworzenie tlanslatroa XSLT z formatu XTT do plików dot oraz SVG.
Niestety reprezentacja plików XTT nie prezentuje sie najlepiej w graphize. Ograniczenia jakie napotkałem podczas tworzenia plików dot są opisane poniżej:
xttml→gv
Translacja XTTML20 do graphviza
Opis ograniczeń podejścia xttml→gv
Tekst w komurakch tabeli nie moze zawierać znaków : <, >, }, {
graviz nie radzi sobie z odpowiednim ustawieniem przy złożonych diagramach (źle rysuje polączenia miedzy tabelami)
xttml→SVG
Plik XSL:
xttml → svg (XSL) xttml2svg.xsl
Działanie translatora zostało przetestowane na poniższych silnikach XSLT:
Poniżej podano komendy wywołujące dany silnik.
XALAN
java org.apache.xalan.xslt.Process -in thermostat2.0.xml -xsl xttml2svg.xsl
Saxon
java net.sf.saxon.Transform -s:source -xsl:stylesheet -o:output
Przykładowy wynik działania translatora dla pliku termostat:
przykladowy wynik translatora
Materiały