<?xml version = "1.0" encoding = "utf-8"?>
<?xml-stylesheet href="/pool/rng_ht.xslt" type="application/xml"?>
<!-- file KLEIDER/web/src/favourites/visits.rng -->
<!--
  Besuche der Website http://kleider.herbaer.de
  "http://herbaer.de/xmlns/20170605/visits/"
  2017 Herbert Schiemann <h.schiemann@herbaer.de>
  Borkener Str. 167, 46284 Dorsten, Deutschland
  GPL Version 2 oder neuer
  Jede Gewährleistung ist ausgeschlossen.

  Das Schema folgt den folgenden Richtlinien:
  - Jedes Attribut und jedes Element wird in einem
    <define>-Element spezifiziert
  - Jedes <define>-Element spezifiziert höchstens ein Attribut oder Element
  - Die Namen der Muster ("Pattern"), die ein Attribut spezifizieren,
    beginnen mit "att_".
  - Die Namen der Muster, die ein Element spezifizieren,
    beginnen mit "el_".
  - Die Dokumentation ist in den define-Elementen enthalten und benutzt
    DocBook-XML-artige Markierungen des Namensraums
    http://herbaer.de/xmlns/20051201/doc
-->
<grammar
  xmlns    = "http://relaxng.org/ns/structure/1.0"
  xmlns:d  = "http://herbaer.de/xmlns/20051201/doc"
  xmlns:xl = "http://www.w3.org/1999/xlink"
  ns       = "http://herbaer.de/xmlns/20170605/visits/"
>

<d:info xmlns="http://herbaer.de/xmlns/20051201/doc">
  <title>visits.rng</title>
  <subtitle>Besuche der Website http://kleider.herbaer.de</subtitle>
  <date>2017-06-05</date>
  <author>
    <personname>
      <firstname>Herbert</firstname>
      <surname>Schiemann</surname>
    </personname>
    <email>h.schiemann@herbaer.de</email>
  </author>
</d:info>

<start>
  <ref name = "el_visits"/>
</start>

<define name = "anything">
  <d:para>Beliebiger Inhalt</d:para>
  <zeroOrMore>
    <choice>
      <element>
        <anyName/>
        <ref name = "anything"/>
      </element>
      <attribute>
        <anyName/>
      </attribute>
      <text/>
    </choice>
  </zeroOrMore>
</define>

<define name = "foreign_att">
  <d:para>Attribute anderer XML-Namensräume</d:para>
  <zeroOrMore>
    <attribute>
      <anyName>
        <except>
          <nsName ns = ""/>
          <nsName ns = "http://herbaer.de/xmlns/20170605/visits/"/>
        </except>
      </anyName>
    </attribute>
  </zeroOrMore>
</define>

<define name = "foreign_el">
  <d:para>Elemente anderer XML-Namensräume</d:para>
  <zeroOrMore>
    <element>
      <anyName>
        <except>
          <nsName ns = "http://herbaer.de/xmlns/20170605/visits/"/>
        </except>
      </anyName>
      <ref name = "anything"/>
    </element>
  </zeroOrMore>
</define>

<define name = "el_visits">
  <d:para>
Daten zu Besuchen der Website.
Die Auswertung wird vom Programm <d:filename>accesslog.pl</d:filename>
erstellt.
</d:para>
  <element name = "visits">
    <ref name = "foreign_att"/>
    <interleave>
      <ref name = "el_time"/>
      <zeroOrMore>
        <ref name = "el_accesslogfile"/>
      </zeroOrMore>
      <zeroOrMore>
        <ref name = "el_visit"/>
      </zeroOrMore>
      <optional>
        <ref name = "el_first_time"/>
      </optional>
      <optional>
        <ref name = "el_last_time"/>
      </optional>
      <optional>
        <ref name = "el_numvisits"/>
      </optional>
      <optional>
        <ref name = "el_numstories"/>
      </optional>
      <optional>
        <ref name = "el_numimages"/>
      </optional>
      <zeroOrMore>
        <ref name = "el_favstories"/>
      </zeroOrMore>
      <zeroOrMore>
        <ref name = "el_favimages"/>
      </zeroOrMore>
      <zeroOrMore>
        <ref name = "el_favlangs"/>
      </zeroOrMore>
    </interleave>
  </element>
</define><!-- el_visits -->

<define name = "el_time">
  <d:para>
Zeit, zu der das Dokument erstellt worden ist.
  </d:para>
  <element name = "time">
    <ref name = "foreign_att"/>
    <data type = "dateTime"/>    
  </element>
</define><!-- el_time -->

<define name = "el_accesslogfile">
  <d:para>
Name einer ausgewerteten Accesslog-Datei.
Die Namen stehen in derselben Reihenfolge,
in der die Dateien ausgewertet wurden.
  </d:para>
  <element name = "accesslogfile">
    <ref name = "foreign_att"/>
    <data type = "filename"/>
  </element>
</define>

<define name = "el_visit">
  <d:para>
Daten zu einem Besuch.
Zwei erfolgreiche GET-Requests werden demselben Besuch zugeordnet,
wenn sie von derselben IP-Adresse mit demselben "Agenten" (user agent)
erfolgten
und höchstens eine bestimmte Zeit
(<d:replaceable>TIMEOUT</d:replaceable> Sekunden)
auseinander liegen.
  </d:para>
  <element name = "visit">
    <ref name = "foreign_att"/>
    <interleave>
      <ref name = "foreign_el"/>
      <optional>
        <ref name = "el_ownsite"/>
      </optional>
      <ref name = "el_files"/>
      <ref name = "el_ip"/>
      <ref name = "el_agent"/>
      <ref name = "el_first_access"/>
      <ref name = "el_last_access"/>
      <optional>
        <ref name = "el_ref"/>
      </optional>
      <optional>
        <ref name = "el_trfin"/>
      </optional>
      <optional>
        <ref name = "el_trfout"/>
      </optional>
      <optional>
        <ref name = "el_reqtime"/>
      </optional>
      <optional>
        <ref name = "el_stories"/>
      </optional>
      <optional>
        <ref name = "el_images"/>
      </optional>
      <zeroOrMore>
        <ref name = "el_lang"/>
      </zeroOrMore>
    </interleave>
  </element>
</define><!-- el_visit -->

<define name = "el_ownsite">
  <d:para>
Dieses Elemente kennzeichnet Besuche meiner Website durch mich selbst.
Der Inhalt ist die Anzahl der besuchten Pfade, die auf einen "Eigenbesuch" hinweisen.
  </d:para>
  <element name = "ownsite">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_files">
  <d:para>
Die Pfade der bei einem Besuch angeforderten Dateien
  </d:para>
  <element name = "files">
    <ref name = "foreign_att"/>
    <interleave>
      <ref name = "foreign_el"/>
      <interleave>
        <ref name = "foreign_el"/>
        <zeroOrMore>
          <ref name = "el_file"/>
        </zeroOrMore>
      </interleave>
    </interleave>
  </element>
</define><!-- el_files -->

<define name = "el_file">
  <d:para>
Eine bei einem Besuch angeforderte Datei
  </d:para>
  <element name = "file">
    <ref name = "foreign_att"/>
    <data type = "string"/>
  </element>
</define><!-- el_file -->

<define name = "el_ip">
  <d:para>
Die IP-Adresse, von der die Website besucht wurde.
In den Log-Dateien sind die letzen beiden Bytes einer IP4-Adresse
durch 0 ersetzt. Die genaue IP4-Adresse ist nicht bekannt,
sondern nur ein Adressbereich.
  </d:para>
  <element name = "ip">
    <ref name = "foreign_att"/>
    <data type = "string"/>
  </element>
</define><!-- el_ip -->

<define name = "el_agent">
  <d:para>
Der "User Agent", der die Website besucht hat.
  </d:para>
  <element name = "agent">
    <ref name = "foreign_att"/>
    <data type = "string"/>
  </element>
</define><!-- el_agent -->

<define name = "el_first_access">
  <d:para>
Datum und Zeit der ersten Anfrage eines Besuchs.
  </d:para>
  <element name = "first_access">
    <ref name = "foreign_att"/>
    <data type = "dateTime"/>
  </element>
</define><!-- el_first_access -->

<define name = "el_last_access">
  <d:para>
Datum und Zeit der letzten Anfrage eines Besuchs.
  </d:para>
  <element name = "last_access">
    <ref name = "foreign_att"/>
    <data type = "dateTime"/>
  </element>
</define><!-- el_last_access -->

<define name = "el_ref">
  <d:para>
Der "Referer" zum Besuch.
  </d:para>
  <element name = "ref">
    <ref name = "foreign_att"/>
    <data type = "string"/>
  </element>
</define><!-- el_ref -->

<define name = "el_trfin">
  <d:para>
Anzahl der empfangenen Bytes zu erfolgreichen Anfragen
  </d:para>
  <element name = "trfin">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_trfout">
  <d:para>
Anzahl der gesendeten Bytes zu erfolgreichen Anfragen
  </d:para>
  <element name = "trfout">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_reqtime">
  <d:para>
Anzahl der benötigten Sekunden zur Beantwortung der erfolgreichen Anfragen.
Es werden nur ganze Sekunden zu jeder Anfrage gezählt.
  </d:para>
  <element name = "reqtime">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_stories">
  <d:para>
Die bei einem Besuch angeforderten Bildergeschichten.
  </d:para>
  <element name = "stories">
    <ref name = "foreign_att"/>
    <interleave>
      <oneOrMore>
        <ref name = "el_story"/>
      </oneOrMore>
      <ref name = "foreign_el"/>
    </interleave>
  </element>
</define><!-- el_stories -->

<define name = "el_story">
  <d:para>
Die Kennung einer (besuchten) Geschichte
  </d:para>
  <element name = "story">
    <ref name = "foreign_att"/>
    <data type = "string"/>
  </element>
</define><!-- el_story -->

<define name = "el_images">
  <d:para>
Die bei einem Besuch angeforderten Bilder.
  </d:para>
  <element name = "images">
    <ref name = "foreign_att"/>
    <interleave>
      <oneOrMore>
        <ref name = "el_image"/>
      </oneOrMore>
      <ref name = "foreign_el"/>
    </interleave>
  </element>
</define><!-- el_images -->

<define name = "el_image">
  <d:para>
Ein besuchtes Bild
  </d:para>
  <element name = "image">
    <ref name = "foreign_att"/>
    <data type = "string"/>
  </element>
</define><!-- el_image -->

<define name = "el_lang">
  <d:para>
Die Kennung der Sprache einer Lokalisierungsdatei
  </d:para>
  <element name = "lang">
    <ref name = "foreign_att"/>
    <data type = "string"/>
  </element>
</define>

<define name = "el_first_time">
  <d:para>
Datum und Zeit der ersten ausgewerteten Anfrage (Request).
  </d:para>
  <element name = "first_time">
    <ref name = "foreign_att"/>
    <data type = "dateTime"/>
  </element>
</define><!-- el_first_time -->

<define name = "el_last_time">
  <d:para>
Datum und Zeit der letzten ausgewerteten Anfrage.
  </d:para>
  <element name = "last_time">
    <ref name = "foreign_att"/>
    <data type = "dateTime"/>
  </element>
</define><!-- el_last_time -->

<define name = "el_numvisits">
  <d:para>
Zahlen der Besuche,
die wenigstens eine "Story" und ein Bild angefordert haben
(&#x201e;echte Besuche&#x201d;).
Die Kindelemente enthalten die Zahlen nach Sprachen aufgeschlüsselt.
Ein Besuch kann für mehrere Sprachen zählen.
  </d:para>
  <element name = "numvisits">
    <ref name = "foreign_att"/>
    <interleave>
      <ref name = "foreign_el"/>
      <zeroOrMore>
        <ref name = "el_num"/>
      </zeroOrMore>
    </interleave>
  </element>
</define><!-- el_numvisits -->

<define name = "el_numstories">
  <d:para>
Zahlen der echten Besuche
aufgeschlüsselt nach Bildergeschichten und Sprache.
Ein Besuch kann für mehrere Bildergeschichten und mehrere Sprachen zählen,
dann aber für alle besuchten Bildergeschichten und alle abgerufenen Sprachen.
Wenn bei einem Besuch eine Bildergeschichte in Französisch,
eine andere Bildergeschichte in Deutsch abgerufen wurde, dann zählt der Besuch
für beide Bildergeschichten in beiden Sprachen.
Eine feinere Unterscheidung anhand der Log-Dateien ist schwierig.
  </d:para>
  <element name = "numstories">
    <ref name = "foreign_att"/>
    <interleave>
      <ref name = "foreign_el"/>
      <zeroOrMore>
        <ref name = "el_num"/>
      </zeroOrMore>
    </interleave>
  </element>
</define>

<define name = "el_numimages">
  <d:para>
Zahlen der echten Besuche
aufgeschlüsselt nach Bildern und Sprache.
  </d:para>
  <element name = "numimages">
    <ref name = "foreign_att"/>
    <interleave>
      <ref name = "foreign_el"/>
      <zeroOrMore>
        <ref name = "el_num"/>
      </zeroOrMore>
    </interleave>
  </element>
</define>

<define name = "el_num">
  <d:para>
Zahlen der echten Besuche der Website insgesamt,
einer Bildergeschichte oder eines Bildes
in einer bestimmten Sprache oder in allen Sprachen
  </d:para>
  <element name = "num">
    <ref name = "foreign_att"/>
    <optional>
      <choice>
        <ref name = "att_story"/>
        <ref name = "att_image"/>
      </choice>
    </optional>
    <ref name = "att_lang"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "att_story">
  <d:para>
Kennung einer Bildergeschichte
  </d:para>
  <attribute name = "story">
    <data type = "word"/>
  </attribute>
</define>

<define name = "att_image">
  <d:para>
Kennung einer Bildes
  </d:para>
  <attribute name = "image">
    <data type = "string"/>
  </attribute>
</define>

<define name = "att_lang">
  <d:para>
Kennung einer Sprache.
Der Wert <d:literal>total</d:literal>
tsteht für alle Sprachen oder eine beliebige Sprache.
  </d:para>
  <attribute name = "lang">
    <data type = "word"/>
  </attribute>
</define>

<define name = "el_favstories">
  <d:para>
Die Bildergeschichten sortiert nach ihrer Beliebtheit
in einer bestimmten Sprache, die das Attribut
<d:tag class = "attribute" linkend = "visits_att_lang">lang</d:tag> bezeichnet.
  </d:para>
  <element name = "favstories">
    <interleave>
      <ref name = "foreign_att"/>
      <optional>
        <ref name = "att_lang"/>
      </optional>
    </interleave>
    <interleave>
      <ref name = "foreign_el"/>
      <oneOrMore>
        <ref name = "el_favstory"/>
      </oneOrMore>
    </interleave>
  </element>
</define>

<define name = "el_favstory">
  <d:para>
Daten zur Beliebtheit einer Bildergeschichte in einer bestimmten Sprache.
  </d:para>
  <element name = "favstory">
    <interleave>
      <ref name = "foreign_el"/>
      <ref name = "el_story"/>
      <ref name = "el_fs_visits"/>
      <optional>
        <ref name = "el_stoimg"/>
      </optional>
      <optional>
        <ref name = "el_total"/>
      </optional>
      <optional>
        <ref name = "el_sitot"/>
      </optional>
    </interleave>
  </element>
</define>

<define name = "el_fs_visits">
  <d:para>
Die Zahl der Besuche (gesamt, einer Bildergeschichte oder eines Bildes)
in einer bestimmten Sprache.
  </d:para>
  <element name = "visits">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_stoimg">
  <d:para>
Die Anzahl der Besuche eines Bildes in einer bestimmten Sprache
wird über alle Bilder der Bildergeschichte summiert.
  </d:para>
  <element name = "stoimg">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_total">
  <d:para>
Die Anzahl der Besuche eines Bildes oder einer Bildergeschichte
in einer beliebigen Sprache.
  </d:para>
  <element name = "total">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_sitot">
  <d:para>
Die Anzahl der Besuche eines Bildes in einer beliebigen Sprache
wird über alle Bilder der Bildergeschichte summiert.
  </d:para>
  <element name = "sitot">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_favimages">
  <d:para>
Die Bilder sortiert nach ihrer Beliebtheit
in einer bestimmten Sprache, die das Attribut
<d:tag class = "attribute" linkend = "visits_att_lang">lang</d:tag> bezeichnet.
  </d:para>
  <element name = "favimages">
    <interleave>
      <ref name = "foreign_att"/>
      <ref name = "att_lang"/>
    </interleave>
    <interleave>
      <ref name = "foreign_el"/>
      <oneOrMore>
        <ref name = "el_favimage"/>
      </oneOrMore>
    </interleave>
  </element>
</define>

<define name = "el_favimage">
  <d:para>
Daten zur Beliebtheit eines Bildes in einer bestimmten Sprache.
  </d:para>
  <element name = "favimage">
    <interleave>
      <ref name = "foreign_el"/>
      <ref name = "el_imgid"/>
      <ref name = "el_fs_visits"/>
      <optional>
        <ref name = "el_stoimg"/>
      </optional>
      <optional>
        <ref name = "el_fi_story"/>
      </optional>
      <optional>
        <ref name = "el_total"/>
      </optional>
      <optional>
        <ref name = "el_sitot"/>
      </optional>
      <optional>
        <ref name = "el_stotot"/>
      </optional>
    </interleave>
  </element>
</define>

<define name = "el_imgid">
  <d:para>
Die Kennung eines Bildes
(zusammengesetzt aus der Kennung der Bildergeschichte,
einem Schrägstrich und dem Dateinamen des Bildes ohne Suffix.
  </d:para>
  <element name = "imgid">
    <ref name = "foreign_att"/>
    <data type = "string"/>
  </element>
</define>

<define name = "el_fi_story">
  <d:para>
Zahl der Besuche der Bildergeschichte in einer bestimmten Sprache.
  </d:para>
  <element name = "story">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_stotot">
  <d:para>
Zahl der Besuche der Bildergeschichte in einer beliebigen Sprache.
  </d:para>
  <element name = "stotot">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_favlangs">
  <d:para>
Die Sprachen sortiert nach ihrer Beliebtheit
  </d:para>
  <element name = "favlangs">
    <ref name = "foreign_att"/>
    <interleave>
      <ref name = "foreign_el"/>
      <oneOrMore>
        <ref name = "el_favlang"/>
      </oneOrMore>
    </interleave>
  </element>
</define>

<define name = "el_favlang">
  <d:para>
Daten zur Beliebtheit einer Sprache.
  </d:para>
  <element name = "favlang">
    <ref name = "foreign_att"/>
    <interleave>
      <ref name = "foreign_el"/>
      <ref name = "el_lang"/>
      <ref name = "el_fs_visits"/>
      <optional>
        <ref name = "el_fl_images"/>
      </optional>
      <optional>
        <ref name = "el_fl_stories"/>
      </optional>
    </interleave>
  </element>
</define>

<define name = "el_fl_images">
  <d:para>
Die Anzahl der Besuche eines Bildes in einer bestimmten Sprache
wird über alle Bilder summiert.
  </d:para>
  <element name = "images">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_fl_stories">
  <d:para>
Die Anzahl der Besuche einer Bildergeschichte in einer bestimmten Sprache
wird über alle Bildergeschichten summiert.
  </d:para>
  <element name = "stories">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

</grammar>
<!-- end of file KLEIDER/web/src/favourites/visits.rng -->
