Opis

Projekt zakończony

Szymon Deja szydej@gmail.com

Translacja XTTML do innych formatów z użyciem XSLT. : ontologie (OWL), graphviz

Spotkania

080311

  • XSLT
  • obsługa XSD
  • repr. reguł w OWL, RIF?
  • gotowe transl xslt do owl
  • format graphviz: wizualizacja tablic :!:

080318

  • próba translacji XTTML20 do graphviza

080401

  • syntetyczny opis ograniczeń podejścia xttml→gv (czego i dlaczego nie da się zrobić)
  • próba zrobienia tego w SVG patrz FIXME proj z miw z zeszlego roku

080408

080415

  • jw

080429

080527

  • przykłady xttml
  • sprawozd

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;
}

:pl:miw:record.gif

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() &lt; $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() &lt; $col])"/> 
                        <xsl:variable name="y" select=" $ypos +$header+ sum(../../localization/nrow_heights/rh[ position() &lt; $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>&gt;</xsl:text>
                                </xsl:when>
                                <xsl:when test="./@operator='ge'">
                                    <xsl:text>&gt;=</xsl:text>
                                </xsl:when>
                                <xsl:when test="./@operator='l'">
                                    <xsl:text> &lt; </xsl:text>
                                </xsl:when>
                                <xsl:when test="./@operator='le'">
                                    <xsl:text> &lt;= </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() &lt; 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() &lt; $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() &lt; $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

Plik wejsciowy :pl:miw:thermostat2.0.xml

przykladowy wynik translatora termostat.svg

{{:pl:miw:prolog_javasockets_v.1.jpg|:pl:miw:prolog_javasockets_v.1.jpg}}

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 termostat.svg

{{:pl:miw:prolog_javasockets_v.1.jpg|:pl:miw:prolog_javasockets_v.1.jpg

Materiały

pl/miw/miw08_xtt_xml.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0