Fritzbox Adressbuch für SPA525g2

hermann.a

Neuer User
Mitglied seit
18 Aug 2011
Beiträge
81
Punkte für Reaktionen
3
Punkte
8
Hallo,

hier die fb2cisco.xsl:
HTML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<CiscoIPPhoneDirectory>
<Title><xsl:value-of select="/phonebooks/phonebook/@name"/></Title>
<Prompt>Kontakt wählen</Prompt>
<xsl:for-each select="/phonebooks/phonebook/contact">
<xsl:for-each select="telephony/number">
<DirectoryEntry>
<Name><xsl:value-of select="../../person/realName" /></Name>
<xsl:choose>
<xsl:when test="@quickdial&lt;10">
<xsl:element name="Telephone">**70<xsl:value-of select="@quickdial"/></xsl:element>
</xsl:when>

<xsl:when test="@quickdial&gt;9">
<xsl:element name="Telephone">**7<xsl:value-of select="@quickdial"/></xsl:element>
</xsl:when>
</xsl:choose>

<xsl:choose>
<xsl:when test="@vanity!=''">
<xsl:element name="Telephone">**8<xsl:value-of select="@vanity"/></xsl:element>
</xsl:when>
</xsl:choose>

<xsl:choose>
<xsl:when test="@type='home'"><xsl:element name="Telephone"><xsl:value-of select="."/></xsl:element></xsl:when>
<xsl:when test="@type='intern'"><xsl:element name="Telephone"><xsl:value-of select="."/></xsl:element></xsl:when>
<xsl:when test="@type=''"><xsl:element name="Telephone"><xsl:value-of select="."/></xsl:element></xsl:when>
<xsl:when test="@type='memo'"><xsl:element name="Telephone"><xsl:value-of select="."/></xsl:element></xsl:when>
<xsl:when test="@type='work'"><xsl:element name="Telephone"><xsl:value-of select="."/></xsl:element></xsl:when>
<xsl:when test="@type='fax_work'"><xsl:element name="Telephone"><xsl:value-of select="."/></xsl:element></xsl:when>
<xsl:when test="@type='mobile'"><xsl:element name="Telephone"><xsl:value-of select="."/></xsl:element></xsl:when>
<xsl:otherwise><xsl:element name="Telephone"><xsl:value-of select="."/></xsl:element></xsl:otherwise>
</xsl:choose>
</DirectoryEntry>
</xsl:for-each>
</xsl:for-each>
</CiscoIPPhoneDirectory>
</xsl:template>
</xsl:stylesheet>
Mfg
hermann
 

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
12,030
Punkte für Reaktionen
273
Punkte
83
Hm, mindestens <Name/> müsste ja in einer Zeile stehen.
Alle <Telephone/> Elemente werden ja noch mit <xsl:element> erzeugt.
...da warste noch nicht fertig ;)

Ich helf mal beim ersten <xsl:choose>
HTML:
<xsl:choose>
<xsl:when test="@quickdial&lt;10">
<Telephone>**70<xsl:value-of select="@quickdial"/></Telephone>
</xsl:when>

<xsl:when test="@quickdial&gt;9">
<Telephone>**7<xsl:value-of select="@quickdial"/></Telephone>
</xsl:when>
</xsl:choose>
...eigentlich (vorsichtig und) schnell erledigt ;)

Erklärung zu den when Bedingungen
Da die Grösser-, und Kleinerzeichen als Bedingungsoperator benötigt werden, aber gleichzeitig vom Parser (XSLT-Prozessor) auch als Elementanfang und Ende interpretiert werden, müssen dafür HTML-Entities verwendet werden.
Oder Kurz: &lt; = lower oder less than = <
...und: &gt; = greater than = >
 
Zuletzt bearbeitet:
  • Like
Reaktionen: hermann.a

Theo Tintensich

Aktives Mitglied
Mitglied seit
10 Mrz 2008
Beiträge
1,688
Punkte für Reaktionen
42
Punkte
48
dass aus dem Fritzbox-Eintrag:
Damit das irgendwie etwas besser aussieht, könnte man vielleicht die ID, [und vielleicht auch den "Typ" (in deinem Beispiel 'work')] in den Namen einbauen. Also "KD-Service-Nummer 1", "KD-Service-Nummer 2","KD-Service-Nummer 3"
Also, wenn man das könnte ;-)
 
  • Like
Reaktionen: hermann.a

hermann.a

Neuer User
Mitglied seit
18 Aug 2011
Beiträge
81
Punkte für Reaktionen
3
Punkte
8
Hallo,

also, ich habs jetzt mal nach dem Muster probiert, die "element"-Elemente :) zu entfernen. Ergebnis ist aber bescheiden...

HTML:
<contact>
      <category>
        0
      </category>
      <person>
        <realName>
          KD-Service-Nummer
        </realName>
      </person>
      <telephony nid="3">
        <number type="work" prio="1" id="0">
          08006648390
        </number>
        <number type="work" prio="0" id="1">
          08005266625
        </number>
        <number type="work" prio="0" id="2">
          08006648389
        </number>
      </telephony>
      <services />
        <setup />
          <mod_time>
            1456851566
          </mod_time>
          <uniqueid>
            121
          </uniqueid>
    </contact>
Das Script schaut nun so aus:

HTML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<CiscoIPPhoneDirectory>
<Title><xsl:value-of select="/phonebooks/phonebook/@name"/></Title>
<Prompt>Kontakt wählen</Prompt>
<xsl:for-each select="/phonebooks/phonebook/contact">
<xsl:for-each select="telephony/number">
<DirectoryEntry>
<Name><xsl:value-of select="../../person/realName" /></Name>
<xsl:choose>
<xsl:when test="@quickdial&lt;10">
<Telephone>**70<xsl:value-of select="@quickdial"/></Telephone>
</xsl:when>

<xsl:when test="@quickdial&gt;9">
<Telephone">**7<xsl:value-of select="@quickdial"/></Telephone>
</xsl:when>
</xsl:choose>

<xsl:choose>
<xsl:when test="@vanity!=''">
<Telephone>**8<xsl:value-of select="@vanity"/></Telephone>
</xsl:when>
</xsl:choose>

<xsl:choose>
<xsl:when test="@type='home'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type='intern'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type=''"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type='memo'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type='work'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type='fax_work'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type='mobile'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:otherwise><Telephone><xsl:value-of select="."/></Telephone></xsl:otherwise>
</xsl:choose>
</DirectoryEntry>
</xsl:for-each>
</xsl:for-each>
</CiscoIPPhoneDirectory>
</xsl:template>
</xsl:stylesheet>
Was hab ich da jetzt falsch verbrochen?

Mfg
Hermann
 

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
12,030
Punkte für Reaktionen
273
Punkte
83
Das Erste ist die Quell XML, nicht das bescheidene Ergebnis.
...aber da sind schon die Einrückungen und Zeilenumbrüche drinne.
Wer erzeugt denn die?
In XSLT muss man sowas mit normalize-space() wieder hinbiegen.
Die Funktion gehört in den Selektor, Beispiel...
HTML:
<xsl:value-of select="normalize-space(/SnomIPPhoneInput/Title)" />

@Theo Tintensich: Ja, das geht. Ein Suffix im <Name> des type Attributes und eine hochzählende Nummer macht Sinn ;)
Wobei type...
HTML:
<Name><xsl:value-of select="../../person/realName" /><xsl:text> </xsl:text><xsl:value-of select="@type" /></Name>
( for-each in number kann Attribut @type direkt selektieren )
...einfach ist, aber die Nummer eine Variable sein muss, die...
1. Definiert werden muss
2. Im for-each für number nach der Selektion um 1 erhöht werden muss
3. An den richtigen Stellen auf 1 resetet werden muss

EDIT: Natürlich, id, fängt zwar bei 0 an, aber bei der Ausgabe lässt sich die Zahl erhöhen, so daß die 0 bei Ausgabe zu 1 wird, u.s.w....
( Zu beachten ist aber, dass über TR-64 geladene Telefonbücher keine id in number enthalten )
Und das ist (trotzdem) erstmal später dran ;)
( Priorität )
 
Zuletzt bearbeitet:
  • Like
Reaktionen: hermann.a

hermann.a

Neuer User
Mitglied seit
18 Aug 2011
Beiträge
81
Punkte für Reaktionen
3
Punkte
8
Hallo,

Kommando zurück... in Zeile 18 in der fb2cisco stand "<Telephone">"... Das gab ne Fehlermeldung, und die Konvertierung hat abgebrochen... Hab das " zuviel entfernt, dann ists durchgelaufen. Aber wieder mit Zeilenumbruch im Editor, wie vorher... Im Browser ganz normale Darstellung... Irgendwas stimmt doch da noch nicht, oder?

Anzeige im Editor:
HTML:
<?xml version="1.0" encoding="UTF-8"?>
<CiscoIPPhoneDirectory>
  <Title>Telefonbuch</Title>
  <Prompt>
    Kontakt wählen
  </Prompt>
<DirectoryEntry>
    <Name>
      KD-Service-Nummer
    </Name>
    <Telephone>
      08006648390
    </Telephone>
  </DirectoryEntry>
  <DirectoryEntry>
    <Name>
      KD-Service-Nummer
    </Name>
    <Telephone>
      08005266625
    </Telephone>
  </DirectoryEntry>
  <DirectoryEntry>
    <Name>
      KD-Service-Nummer
    </Name>
    <Telephone>
      08006648389
    </Telephone>
  </DirectoryEntry>
Anzeige im Browser:

HTML:
<?xml version="1.0" encoding="UTF-8"?>
-<CiscoIPPhoneDirectory>
<Title>Telefonbuch</Title>
<Prompt>Kontakt wählen </Prompt>

-<DirectoryEntry>
<Name>KD-Service-Nummer </Name>
<Telephone>08006648390 </Telephone>
</DirectoryEntry>

-<DirectoryEntry>
<Name>KD-Service-Nummer </Name>
<Telephone>08005266625 </Telephone>
</DirectoryEntry>

-<DirectoryEntry>
<Name>KD-Service-Nummer </Name>
<Telephone>08006648389 </Telephone>
</DirectoryEntry>
fb2cisco.xsl
HTML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<CiscoIPPhoneDirectory>
<Title><xsl:value-of select="/phonebooks/phonebook/@name"/></Title>
<Prompt>Kontakt wählen</Prompt>
<xsl:for-each select="/phonebooks/phonebook/contact">
<xsl:for-each select="telephony/number">
<DirectoryEntry>
<Name><xsl:value-of select="../../person/realName" /></Name>
<xsl:choose>
<xsl:when test="@quickdial&lt;10">
<Telephone>**70<xsl:value-of select="@quickdial"/></Telephone>
</xsl:when>

<xsl:when test="@quickdial&gt;9">
<Telephone>**7<xsl:value-of select="@quickdial"/></Telephone>
</xsl:when>
</xsl:choose>

<xsl:choose>
<xsl:when test="@vanity!=''">
<Telephone>**8<xsl:value-of select="@vanity"/></Telephone>
</xsl:when>
</xsl:choose>

<xsl:choose>
<xsl:when test="@type='home'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type='intern'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type=''"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type='memo'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type='work'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type='fax_work'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type='mobile'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:otherwise><Telephone><xsl:value-of select="."/></Telephone></xsl:otherwise>
</xsl:choose>
</DirectoryEntry>
</xsl:for-each>
</xsl:for-each>
</CiscoIPPhoneDirectory>
</xsl:template>
</xsl:stylesheet>
Inhalt Fritzbox.xml
HTML:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="fb2cisco.xsl" ?>
<phonebooks>
<phonebook name="Telefonbuch">
<contact><category>0</category><person><realName>KD-Service-Nummer</realName></person><telephony
nid="3"><number type="work" prio="1" id="0">08006648390</number><number
type="work" prio="0" id="1">08005266625</number><number type="work"
prio="0" id="2">08006648389</number></telephony><services /><setup /><mod_time>1456851566</mod_time><uniqueid>121</uniqueid></contact>
</phonebook>
</phonebooks>
Die fritzbox.xml hab ich auf den einen Teilnehmer mit 3 Nummern gekürzt, damit die Darstellung einfacher ist. Die restlichen Einträge dort sind analog aufgebaut.

Mfg
Hermann
 
Zuletzt bearbeitet:

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
12,030
Punkte für Reaktionen
273
Punkte
83
Keine Ahnung was bei dir los ist.
Die erste (Editor) Anzeige ist ja schon nicht so beabsichtigt, oder?
Und woher kommt das Leerzeichen am End, in <Prompt>, <Name> und <Telephone>, bei "Anzeige im Browser"?
Vielleicht auch mal das Textformat in Notepad++ checken?
UTF-8 ohne BOM wäre ratsam.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: hermann.a

hermann.a

Neuer User
Mitglied seit
18 Aug 2011
Beiträge
81
Punkte für Reaktionen
3
Punkte
8
Hallo,

muss mal wieder sorry sagen.... :oops:

IM IE gibts eine Symbolleiste
Symbol.jpg
Hier hatte ich das linke aktiviert. Da wurde wohl dieser ominöse Zeilenumbruch erzeugt.... Ohne dieses schauts dann mal so aus:

ie-debugger.jpg

Vielen Dank für Deine Geduld! Mit dem Ergebnis kann ich dann an eine Aufteilung des Buches rangehen.

Mfg
Hermann
 
Zuletzt bearbeitet:

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
12,030
Punkte für Reaktionen
273
Punkte
83
Hm, Notepad++ fährt ja eine Anzeige, wo zum "Syntaxhighlightning", noch die Elemente in auf-, und zuklappbare Blöcke gefasst sind ( +/- Symbol ).
Sieht die Datei in einem normalen Editor OK aus?
Befürchte einen typischen "Kopieren und Einfügen" Unfall.
Ansonsten hilft wirklich nur: normalize-space()
 
  • Like
Reaktionen: hermann.a

hermann.a

Neuer User
Mitglied seit
18 Aug 2011
Beiträge
81
Punkte für Reaktionen
3
Punkte
8
Hallo,

im Editor++ schauts dann so aus:

notepad++.jpg

So wollt ich das ja haben...
Es war dieses "Schöndruck"-Symbol im IE. Muss nochmal schauen, wenn ich die "element"-Teile drin lasse, wie sich die Formatierung dann durch Drücken dieses Symbols verändert. Hab wohl irgendwann in meinen Umschreib-Versuchen diesen Button mal gedrückt (die Funktion war bis vorher noch aktiviert...)

Mfg
Hermann
 

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
12,030
Punkte für Reaktionen
273
Punkte
83
Es sei dir verziehen :cool:
...auch solche blöden Fehler müssen an-, und ausgesprochen werden, sonst gehts einfach nicht weiter.

Ergebnis im Editor
Schon besser, nicht perfekt, aber ohne dieses lästige Whitespace.
( Nicht sichtbare Zeichen (CR,LF), Leerzeichen und/oder Tabulatoren )
 
  • Like
Reaktionen: hermann.a

hermann.a

Neuer User
Mitglied seit
18 Aug 2011
Beiträge
81
Punkte für Reaktionen
3
Punkte
8
Hallo,

für mich passts, denn jetzt muss ich noch biomechanisch die knapp 270 Einträge auf mehrere Dateien aufteilen, auf die ich dann aus dem CiscoIPPPhoneMenu abspringe. Zumindest hab ich wieder was gelernt - aber noch nicht alles verstanden :D

Mfg
Hermann
 

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
12,030
Punkte für Reaktionen
273
Punkte
83
Hihi, also, in einem for-each kann mit position() ganz simpel durchnummeriert werden, spielt mal damit...
HTML:
<Name><xsl:value-of select="position()"/>&lt;<xsl:value-of select="../../person/realName" />&gt;<xsl:value-of select="@type" /></Name>
...hab ich von...

Zwei Schönheitsbugs gibts allerdings noch ;)
Die <xsl:choose> für @quickdial und @vanity müssen eigentlich komplette...
<DirectoryEntry>
<Name></Name>
<Telephone></Telephone>
</DirectoryEntry>
...Einträge erzeugen.
Warum? - Sie kommen niemals alleine vor

Dafür müssen aber auch <DirectoryEntry> und <Name> für die normalen Nummern umgesetzt werden.
Ich nenn sie mal: fbphb2cisco.xsl
HTML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<!--xsl:processing-instruction name="xml-stylesheet">
<xsl:text>type="text/xsl" href="/sippd2html.xsl"</xsl:text>
</xsl:processing-instruction-->
<CiscoIPPhoneDirectory>
<Title><xsl:value-of select="/phonebooks/phonebook/@name"/></Title>
<Prompt>Kontakt wählen</Prompt>
<xsl:for-each select="/phonebooks/phonebook/contact">
<xsl:for-each select="telephony/number">
<xsl:choose>
<xsl:when test="@quickdial&lt;10">
<DirectoryEntry>
<Name>&lt;<xsl:value-of select="../../person/realName" />&gt;Intern: <xsl:value-of select="position()"/> quickdial</Name>
<Telephone>**70<xsl:value-of select="@quickdial"/></Telephone>
</DirectoryEntry>
</xsl:when>
<xsl:when test="@quickdial&gt;9">
<DirectoryEntry>
<Name>&lt;<xsl:value-of select="../../person/realName" />&gt;Intern: <xsl:value-of select="position()"/> quickdial</Name>
<Telephone>**7<xsl:value-of select="@quickdial"/></Telephone>
</DirectoryEntry>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="@vanity!=''">
<DirectoryEntry>
<Name>&lt;<xsl:value-of select="../../person/realName" />&gt;Intern: <xsl:value-of select="position()+1"/> vanity</Name>
<Telephone>**8<xsl:value-of select="@vanity"/></Telephone>
</DirectoryEntry>
</xsl:when>
</xsl:choose>
<DirectoryEntry>
<Name>&lt;<xsl:value-of select="../../person/realName" />&gt;Eintrag: <xsl:value-of select="position()"/><xsl:text> </xsl:text><xsl:value-of select="@type" /></Name>
<xsl:choose>
<xsl:when test="@type='home'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type='intern'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type=''"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type='memo'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type='work'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type='fax_work'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:when test="@type='mobile'"><Telephone><xsl:value-of select="."/></Telephone></xsl:when>
<xsl:otherwise><Telephone><xsl:value-of select="."/></Telephone></xsl:otherwise>
</xsl:choose>
</DirectoryEntry>
</xsl:for-each>
</xsl:for-each>
</CiscoIPPhoneDirectory>
</xsl:template>
</xsl:stylesheet>
( Achtung: HTML Stylesheeteinbindung kommentiert )
Pro <number> werden @quickdial und @vanity als "Intern" durchnummeriert, falls vorhanden.
Da @vanity nur existiert wenn auch @quickdial vorhanden ist, aber nicht umgekehrt, bedarf es auch keiner weiteren Prüfung.
...da sonst die Ausgabe von positionr()+1 in der @vanity Prüfung ohne vorhandenes @quickdial falsch wäre.

@Theo Tintensich: Diese Version macht folgende Ausgabe für <Name>...
Screenshot_20200327-103339.png
( HTML Transformation )
 
Zuletzt bearbeitet:
  • Like
Reaktionen: hermann.a

hermann.a

Neuer User
Mitglied seit
18 Aug 2011
Beiträge
81
Punkte für Reaktionen
3
Punkte
8
Hallo,

kurze Rückmeldung: Hab nun auch das Telefonbuch auf 4 Bücher (wegen der Beschränkung auf 32 Einträge) aufteilen können (hab noch überflüssige Nummern entfernt), springe also im Cisco-Verzeichnis-Menü ab auf die CiscoIPPPhoneMenu, und von dort auf 4 Bücher A-E, F-K, I-P, R-Z). Das mit den Kurzwahlen/internen Nummern hab ich ignoriert, da ich die alle rausgenommen habe (Interne Weiterleitung klappt so mit dem Cisco SPA252g2 nicht, hab das auf eine der 5 Leitungs-Taste gelegt).

Vielen, vielen Danke für die Unterstützung, nun hab ich das für mich händelbar; so eine Unterstützung ist nicht selbstverständlich! Großes LOB!

Mfg
Hermann
 
  • Like
Reaktionen: koyaanisqatsi