Zurück   Ahnenforschung.Net Forum > Software und Technik > Genealogie-Programme
Hier klicken, falls Sie Ihr Kennwort vergessen haben.

Hinweise

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #31  
Alt 13.10.2016, 10:03
Benutzerbild von urmel_x
urmel_x urmel_x ist offline männlich
Erfahrener Benutzer
 
Registriert seit: 26.06.2015
Beiträge: 106
Standard

@gki

Hi,

ich denke, als erstes sollte geklärt werden - und dazu reicht erst mal einfaches Text-Format - welche Daten unbedingt dargestellt werden sollen und dann noch eine grobe Struktur des ganzen. Anschließend kann man mit LaTex oder HTML und CSS die Formatierung machen. Als Sortierung der Familien würde ich die Kekule-Zahlen empfehlen. Ich selber fasse gern alle Familien zusammen, die zu einem Ahnen gehören - sprich der Ahne mit seinen Partnern samt den entsprechenden Kindern und den Ehepartnern der Kinder.

Und jetzt versuche ich mal die aktuelle XSL-Datei anzuhängen:

Code:
<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text" indent="yes" encoding="ISO-8859-1" omit-xml-declaration="no"/>

<xsl:template match="/">
    <xsl:apply-templates select="*"/>
</xsl:template>

<xsl:template match="*:database">
    <xsl:apply-templates select="*:families" />
    <!-- <xsl:apply-templates select="*:people" /> -->
</xsl:template>

<xsl:template match="*:people">
    <xsl:apply-templates select="*:person" />
</xsl:template>

<xsl:template match="*:person">
    <xsl:apply-templates select="*:name" />
    <xsl:text>
</xsl:text>
</xsl:template>

<xsl:template match="*:name">
    <xsl:choose>
        <xsl:when test="@type='Birth Name'">
            <xsl:value-of select="*:surname" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:text>???</xsl:text>
        </xsl:otherwise>
    </xsl:choose>
    <xsl:text>, </xsl:text>
    <xsl:value-of select="*:first" />
</xsl:template>

<xsl:template match="*:families">
    <xsl:apply-templates select="*:family" />
</xsl:template>

<xsl:template match="*:family">
    <xsl:if test="*:father">
        <xsl:call-template name="search_person">
            <xsl:with-param name="hlink" select="*:father/@hlink" />
        </xsl:call-template>
<xsl:text>
</xsl:text>
    </xsl:if>
    <xsl:if test="*:mother">
        <xsl:call-template name="search_person">
            <xsl:with-param name="hlink" select="*:mother/@hlink" />
        </xsl:call-template>
<xsl:text>
</xsl:text>
    </xsl:if>
    <xsl:for-each select="*:childref">
        <xsl:text>      - </xsl:text>
        <xsl:call-template name="search_person">
            <xsl:with-param name="hlink" select="@hlink" />
        </xsl:call-template>
<xsl:text>
</xsl:text>
    </xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:template>

<xsl:template name="search_person">
    <xsl:param name="hlink" />

    <xsl:apply-templates select="/descendant::*:person[$hlink=@handle]/*:name" />
</xsl:template>

</xsl:stylesheet>
Mit Zitat antworten
  #32  
Alt 13.10.2016, 14:37
gki gki ist offline
Erfahrener Benutzer
 
Registriert seit: 18.01.2012
Beiträge: 4.810
Standard

Hallo Urmel!

Zitat:
Zitat von urmel_x Beitrag anzeigen
ich denke, als erstes sollte geklärt werden - und dazu reicht erst mal einfaches Text-Format - welche Daten unbedingt dargestellt werden sollen und dann noch eine grobe Struktur des ganzen.
Ich denke, da werden wir es nie allen recht machen können. Von daher sollte man das den Endbenutzern überlassen. Ideal wären gewisse LaTeX-Befehle in einer Klasse zu definieren, die dann aufgerufen werden könnten.

Also etwa

\gentree[3]{P00001}

würde dann den Stammbaum von der Person mit der Gramps-ID P00001 auf drei Generationen an der Stelle ausgeben.

Der würde natürlich ein gewisses Standard-Layout haben, was dann evtl. durch zusätzliche Befehle angepaßt werden könnte.

Die LaTeX-Makros würden dann Saxon (geht xsltproc auch?) aufrufen, um die Daten aus dem XML zu saugen.

Dadurch würden die Endbenutzer nur LaTeX anwenden müssen, nicht auch noch XSL.

Zitat:
Und jetzt versuche ich mal die aktuelle XSL-Datei anzuhängen:
Vielen Dank!

Allein: ich kann sie nicht anwenden... Irgendwas mach ich wohl falsch...

saxonb-xslt -s:gki.xml -xsl:gramps_latex.xsl

gramps_latex.xsl ist Deine Datei, gki.xml meine Daten als ausgepacktes Gramps-XML.


Error on line 1 column 3 of grampsxml.dtd:
SXXP0003: Error reported by XML parser: The markup declarations contained or pointed to by
the document type declaration must be well-formed.
Transformation failed: Run-time errors were reported

Er nölt an der grampsxml.dtd rum, die das XML ja referenziert. Merkwürdig. Ne Idee?
__________________
Gruß
gki
Mit Zitat antworten
  #33  
Alt 13.10.2016, 16:10
Benutzerbild von urmel_x
urmel_x urmel_x ist offline männlich
Erfahrener Benutzer
 
Registriert seit: 26.06.2015
Beiträge: 106
Standard

Zitat:
Zitat von gki Beitrag anzeigen
Error on line 1 column 3 of grampsxml.dtd:
SXXP0003: Error reported by XML parser: The markup declarations contained or pointed to by
the document type declaration must be well-formed.
Transformation failed: Run-time errors were reported
Hab ich auch - einfach Zeile 2 der XML-Datei löschen, die anfängt mit

<!DOCTYPE ...

Die braucht man nicht wirklich - da stimmt entweder beim XSL-Prozessor was nicht oder bei GRAMPS.

Gruß,

Urmel.
Mit Zitat antworten
  #34  
Alt 13.10.2016, 16:17
Benutzerbild von urmel_x
urmel_x urmel_x ist offline männlich
Erfahrener Benutzer
 
Registriert seit: 26.06.2015
Beiträge: 106
Standard

Zitat:
Zitat von gki Beitrag anzeigen
Ich denke, da werden wir es nie allen recht machen können. Von daher sollte man das den Endbenutzern überlassen. Ideal wären gewisse LaTeX-Befehle in einer Klasse zu definieren, die dann aufgerufen werden könnten.
Man kann dem XSL-Prozessor (z.B. Saxon) beim Kommando-Aufruf Parameter mitgeben, welche die Ausgabe der XSL-Transformation steuern. Der Nutzer sollte das XSL-Script nicht ändern müssen - es wird für viele Nutzer schon schwer genug sein, Java, Saxon (o.ä.) und LaTex zu installieren.

Gruß,

Urmel.
Mit Zitat antworten
  #35  
Alt 14.10.2016, 11:23
gki gki ist offline
Erfahrener Benutzer
 
Registriert seit: 18.01.2012
Beiträge: 4.810
Standard

Hallo Urmel,

den Nutzer die Gramps-Datei bearbeiten zu lassen ist irgendwie keine Lösung, das müßte man anders lösen. Ich hab etwas gegoogelt, das schein allerdings kompliziert zu sein.

Ich würde den Nutzer auch eher vom XSLT abkapseln wollen. Ich denke, daß LaTeX da eine etwas (aber auch nur etwas) freundlichere Unser-Interaktion zu bieten hat.
__________________
Gruß
gki
Mit Zitat antworten
  #36  
Alt 14.10.2016, 15:55
Benutzerbild von urmel_x
urmel_x urmel_x ist offline männlich
Erfahrener Benutzer
 
Registriert seit: 26.06.2015
Beiträge: 106
Standard

Ich habe jetzt als Beispiel das Script erweitert um eine Parametereingabe, mit der man zu einer Person und deren Kekule-Nummer eine Liste der Vorfahren mi deren Kekule-Nummer ausgeben kann á la

kekule-nr.: name, vornam(en)

mittels

java net.sf.saxon.Transform -s:data.gramps -xsl:gramps.xsl PROBAND=personen-id-aus-gramps KEKULE=gewünschte-start-nummer

Code:
<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text" indent="yes" encoding="ISO-8859-1" omit-xml-declaration="no"/>

<xsl:param name="PROBAND" />
<xsl:param name="KEKULE" />

<xsl:template match="/">
    <xsl:choose>
        <xsl:when test="$PROBAND and $KEKULE">
            <xsl:variable name="kekule">
                <xsl:call-template name="make_kekule">
                    <xsl:with-param name="proband_ID" select="$PROBAND" />
                    <xsl:with-param name="kekule_nr" select="$KEKULE" />
                </xsl:call-template>
            </xsl:variable>
            <xsl:variable name="database" select="/*:database" />
            <xsl:for-each select="$kekule/kekule/numbers/person">
                <xsl:value-of select="@kekule" />
                <xsl:text>: </xsl:text>
                <xsl:call-template name="person_by_id">
                    <xsl:with-param name="person" select="@id" />
                    <xsl:with-param name="database" select="$database" />
                </xsl:call-template>
            </xsl:for-each>
        </xsl:when>
        <xsl:otherwise>
            <xsl:apply-templates select="*"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template match="*:database">
    <xsl:apply-templates select="*:families" />
    <!-- <xsl:apply-templates select="*:people" /> -->
</xsl:template>

<xsl:template match="*:people">
    <xsl:apply-templates select="*:person" />
</xsl:template>

<xsl:template match="*:person">
    <xsl:apply-templates select="*:name" />
    <xsl:text>
</xsl:text>
</xsl:template>

<xsl:template match="*:name">
    <xsl:choose>
        <xsl:when test="@type='Birth Name'">
            <xsl:value-of select="*:surname" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:text>???</xsl:text>
        </xsl:otherwise>
    </xsl:choose>
    <xsl:text>, </xsl:text>
    <xsl:value-of select="*:first" />
</xsl:template>

<xsl:template match="*:families">
    <xsl:apply-templates select="*:family" />
</xsl:template>

<xsl:template match="*:family">
    <xsl:if test="*:father">
        <xsl:call-template name="search_person">
            <xsl:with-param name="hlink" select="*:father/@hlink" />
        </xsl:call-template>
<xsl:text>
</xsl:text>
    </xsl:if>
    <xsl:if test="*:mother">
        <xsl:call-template name="search_person">
            <xsl:with-param name="hlink" select="*:mother/@hlink" />
        </xsl:call-template>
<xsl:text>
</xsl:text>
    </xsl:if>
    <xsl:for-each select="*:childref">
        <xsl:text>      - </xsl:text>
        <xsl:call-template name="search_person">
            <xsl:with-param name="hlink" select="@hlink" />
        </xsl:call-template>
<xsl:text>
</xsl:text>
    </xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:template>

<xsl:template name="search_person">
    <xsl:param name="hlink" />

    <xsl:apply-templates select="/descendant::*:person[$hlink=@handle]/*:name" />
</xsl:template>

<xsl:template name="person_by_id">
    <xsl:param name="person" />
    <xsl:param name="database" />
    <xsl:apply-templates select="$database/*:people/*:person[@id=$person]" />
</xsl:template>

<xsl:template name="make_kekule">
    <xsl:param name="proband_ID" select="I0000" />
    <xsl:param name="kekule_nr" select="1" />

    <xsl:variable name="kekule">
        <kekule>
            <xsl:call-template name="kekule">
                <xsl:with-param name="person_ID" select="$proband_ID" />
                <xsl:with-param name="kekule_nr" select="$kekule_nr" />
            </xsl:call-template>
        </kekule>
    </xsl:variable>
    <kekule>
        <numbers>
            <xsl:for-each select="$kekule/kekule/person">
                <xsl:sort select="@kekule" data-type="number" />
                <xsl:copy-of select="." />
            </xsl:for-each>
        </numbers>
        <people>
            <xsl:for-each-group select="$kekule/kekule/person" group-by="@id">
                <person id="{@id}">
                    <xsl:for-each select="current-group()">
                        <xsl:sort select="@kekule" data-type="number" />
                        <nr><xsl:value-of select="@kekule"/></nr>
                    </xsl:for-each>
                </person>
            </xsl:for-each-group>
        </people>
    </kekule>
</xsl:template>

<xsl:template name="kekule">
    <xsl:param name="person_ID" />
    <xsl:param name="kekule_nr" />

    <xsl:variable name="person" select="/*/*:people/*:person[@id=$person_ID]" />

    <xsl:if test="$person">
        <person id="{$person_ID}" kekule="{$kekule_nr}" />
        <xsl:variable name="childof" select="$person/*:childof" />
        <xsl:if test="$childof">
            <xsl:variable name="family" select="/*/*:families/*:family[@handle=$childof/@hlink]" />
            <xsl:if test="$family">
                <xsl:if test="$family/*:father">
                    <xsl:variable name="father" select="/*/*:people/*:person[@handle=$family/*:father/@hlink]" />
                    <xsl:if test="$father">
                        <xsl:call-template name="kekule">
                            <xsl:with-param name="person_ID" select="$father/@id" />
                            <xsl:with-param name="kekule_nr" select="$kekule_nr * 2" />
                        </xsl:call-template>
                    </xsl:if>
                </xsl:if>
                <xsl:if test="$family/*:mother">
                    <xsl:variable name="mother" select="/*/*:people/*:person[@handle=$family/*:mother/@hlink]" />
                    <xsl:if test="$mother">
                        <xsl:call-template name="kekule">
                            <xsl:with-param name="person_ID" select="$mother/@id" />
                            <xsl:with-param name="kekule_nr" select="$kekule_nr * 2 + 1" />
                        </xsl:call-template>
                    </xsl:if>
                </xsl:if>
            </xsl:if>
        </xsl:if>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>
Mit Zitat antworten
  #37  
Alt 15.10.2016, 11:10
gki gki ist offline
Erfahrener Benutzer
 
Registriert seit: 18.01.2012
Beiträge: 4.810
Standard

Hallo Urmel,

funktioniert super!

Ich werd mich mal bemühen, ein paar LaTeX-Formatierungen einzubauen.

Mich würde interessieren, von anderen zu hören, ob sie diese Vorgehensweise für sinnvoll erachten.
__________________
Gruß
gki
Mit Zitat antworten
  #38  
Alt 15.10.2016, 12:59
gki gki ist offline
Erfahrener Benutzer
 
Registriert seit: 18.01.2012
Beiträge: 4.810
Standard

So, anbei die modifizierte XSL-Datei (als .txt) und eine Beispielausgabe. Ich habe jede Person auf eine Seite getan, einfach damit der Index nicht nur auf eine Seite verweist.
Angehängte Dateien
Dateityp: pdf gramps_xsl.pdf (110,9 KB, 21x aufgerufen)
Dateityp: txt gramps_latex2.txt (6,9 KB, 15x aufgerufen)
__________________
Gruß
gki
Mit Zitat antworten
  #39  
Alt 16.10.2016, 11:33
Benutzerbild von urmel_x
urmel_x urmel_x ist offline männlich
Erfahrener Benutzer
 
Registriert seit: 26.06.2015
Beiträge: 106
Standard

@gki

Super zurecht gefunden! Ich persöhnlich würde die Aufteilung Familien-orientiert anlegen wollen, d.h. jedes Familienoberhaupt - also jede gerade Kekule-Nummer - erhält einen Seitenanfang mit Partnerinnen und Kindern etc.

Die bisherigen Scripts sollen ja nur eine grobe Orientierung geben und die Möglichkeiten andeuten - ich werde mal als nächstes eine Familienorientierte Auflistung angehen - sortiert nach Kekule.

Man kann ja wie gesagt Optionen an das Script übergeben, was man haben will und wie es ausgegeben werden soll - muss halt ins Script programmieert werden.

Gruß,

Urmel.
Mit Zitat antworten
  #40  
Alt 17.10.2016, 11:23
Benutzerbild von urmel_x
urmel_x urmel_x ist offline männlich
Erfahrener Benutzer
 
Registriert seit: 26.06.2015
Beiträge: 106
Standard

@gki

Ich habe das letzte Script von mir noch einmal umstrukturiert und das LaTex eingearbeitet - bitte überprüfen!

Vieleicht versuche ich doch erstmal die GRAMPS-Beziehungen pro Person darzustellen?

Gruß,

Urmel.
Angehängte Dateien
Dateityp: txt gramps_xsl.txt (8,6 KB, 6x aufgerufen)
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
gedcom , latex , tex

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu

Alle Zeitangaben in WEZ +1. Es ist jetzt 12:39 Uhr.