XIP LDAP Import Beispiel: Unterschied zwischen den Versionen

Aus SiteparkWiki
Zur Navigation springen Zur Suche springen
 
(11 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 +
Der Importer fragt die LDAP-Daten vom LDAP-Server ab und wandelt Sie in ein XML-Format um. Über eine spezifisch erstellte XSLT werden die XML-Daten in das XML-XIP Format transformiert (XIP ist ein von Sitepark entwickeltes XML-Format, um Daten in den IES zu importieren).
 +
 +
===Konfiguration des LDAP-Servers===
 +
Die Verbindung zum LDAP-Server wird in IES-Admin unter dem Bereich LDAP konfiguriert. Diese Verbindung wird zur Abfragen der Nutzerdaten für den Import und für die Authentifizierung der Nutzer verwendet.
 +
 +
Die Konfigurationsdateien können z.B. in dem Verzeichnis
 +
/srv/sitepark/ldap/
 +
organisiert werden.
 +
 
===Aufruf des LDAP Imports===
 
===Aufruf des LDAP Imports===
 
Aufruf des LDAP Imports z.B. unter Linux:
 
Aufruf des LDAP Imports z.B. unter Linux:
  /cms/sitepark/bin/iesxip /cms/sitepark/ldap/import.xml
+
  /srv/sitepark/bin/iesxip /srv/sitepark/ldap/import.xml
 
oder als Cronjob:
 
oder als Cronjob:
  23 00 * * * /cms/sitepark/bin/iesxip /cms/sitepark/ldap/import.xml
+
  23 00 * * * /srv/sitepark/bin/iesxip /srv/sitepark/ldap/import.xml
 +
 
 +
Für Tests der Daten kann der Kommando ''iesxip'' mit folgenden Optionen aufgerufen werden:
 +
--dumpXml (Daten nicht importieren, XML-Ausgabe in die Console)
 +
--ignore-xslt (XSLT-Transformation nicht anwenden, XML-Rohdaten ausgeben)
 +
 
 +
===XML Konfiguration: ''import.xml''===
 +
import.xml
 +
Die Konfigurations-Datei des Imports. In dieser Datei sind folgende Konfigurationen enthalten:
 +
*Logging des Imports (Import Log in die Datei import.log)
 +
*Import Nutzer, über den die Nutzer/Artikel im IES gespeichert werden.
 +
*Import-Optionen: Allgemeine Einstellungen das z.B. neue Einträge angelegt und nicht mehr existierende gelöscht werden solle. Weiter wird hier angegeben welche XSLT-Datei das Daten-Mapping vornimmt (import.xslt) und die Synchronisations-Datei um erkennen zu können welche Datensätze gelöscht werden sollen.
 +
*LDAP-Optionen: Hier wird der LDAP-Filter angegeben um nur die Datensätze abzufragen, die auch importiert werden sollen. Weiter wird hier angegeben das zwei LDAP-Attribute base64 encodiert werden, da sie Binäredaten enthalten (sASLoginConfiguration, sASLoginConfigurationKey).
  
===XML Konfiguration (hier: ''import.xml'')===
 
 
<syntaxhighlight lang="xml">
 
<syntaxhighlight lang="xml">
 
<?xml version="1.0" encoding="UTF-8"?>
 
<?xml version="1.0" encoding="UTF-8"?>
 
<import id="ldapimport" name="Import LDAP User">
 
<import id="ldapimport" name="Import LDAP User">
    <logging>
+
  <logging>
        <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
+
      <Appenders>
             <layout class="org.apache.log4j.PatternLayout">
+
        <RollingFile 
                <param name="ConversionPattern" value="%d %-5p %m%n"/>
+
            name="FILE"        
             </layout>
+
            fileName="${sys:sitepark.home}/import-ldap.log"
             <param name="File" value="${sitepark.home}/ldap-import.log"/>
+
             filePattern="${sys:sitepark.home}/import-ldap-%d{dd-MM-yyyy}-%i.log.gz"
             <param name="MaxFileSize" value="10MB"/>
+
            append="true">     
             <param name="MaxBackupIndex" value="10"/>
+
            <PatternLayout>   
        </appender>
+
              <Pattern>%d %-5p %m%n</Pattern>
        <logger name="com.sitepark.ies" additivity="false">
+
             </PatternLayout>  
             <appender-ref ref="FILE"/>
+
             <Policies>         
            <priority value="INFO"/>
+
              <TimeBasedTriggeringPolicy />
        </logger>
+
              <SizeBasedTriggeringPolicy size="10MB" />
    </logging>
+
             </Policies>
 +
             <DefaultRolloverStrategy max="10" />
 +
        </RollingFile>
 +
      </Appenders>
 +
      <Loggers>
 +
        <Logger name="com.sitepark.ies" level="trace" additivity="false">
 +
             <AppenderRef ref="FILE" />
 +
        </Logger>    
 +
      </Loggers>
 +
  </logging>
 
   <ies-connection login="Wartung" password="secret" client="ies2work" module="LDAP Importer"/>
 
   <ies-connection login="Wartung" password="secret" client="ies2work" module="LDAP Importer"/>
 
   <options>
 
   <options>
Zeile 33: Zeile 62:
 
       <deleteOnlyEmptyPools>true</deleteOnlyEmptyPools>
 
       <deleteOnlyEmptyPools>true</deleteOnlyEmptyPools>
 
       <deleteElements>true</deleteElements>
 
       <deleteElements>true</deleteElements>
       <xslt>${sitepark.home}/conf/ldap-import.xslt</xslt>
+
       <xslt>${sitepark.home}/ldap/ldap-import.xslt</xslt>
       <syncFile>${sitepark.home}/conf/ldap-import.sync</syncFile>
+
       <syncFile>${sitepark.home}/ldap/ldap-import.sync</syncFile>
 
   </options>
 
   </options>
 
     <source type="ldap" id="1">
 
     <source type="ldap" id="1">
 +
<encoding attribute="sASLoginConfiguration" encoding="base64"/>
 +
<encoding attribute="sASLoginConfigurationKey" encoding="base64"/>
 
         <query>
 
         <query>
           <ldap-query>
+
           <and>
            <search-filter>(uid=quintama)</search-filter>
+
            <ldap-query>
            <search-base>dc=sitepark,dc=com</search-base>
+
              <search-filter>(uid=quintama)</search-filter>
            <search-scope>subtree</search-scope>
+
              <search-base>dc=sitepark,dc=com</search-base>
            <!-- <limit>1000</limit> -->
+
              <search-scope>subtree</search-scope>
          </ldap-query>
+
              <!-- <limit>1000</limit> -->
 +
            </ldap-query>
 +
            <or>
 +
              <ldap-group member-dn-attribute="uniqueMember">cn=CMS Redakteure,ou=groups,dc=sitepark,dc=com</ldap-group>
 +
              <ldap-group member-dn-attribute="uniqueMember">cn=CMS Administratoren,ou=groups,dc=sitepark,dc=com</ldap-group>
 +
            </or>
 +
          </and>
 
         </query>
 
         </query>
 
     </source>
 
     </source>
Zeile 49: Zeile 86:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
===XSLT Artikelimport===
+
===XSLT Artikelimport: ''ldap-import.xslt''===
 +
In dieser Datei ist das Daten-Mapping zwischen LDAP und IES implementiert
 +
 
 
<syntaxhighlight lang="xml">
 
<syntaxhighlight lang="xml">
 
<?xml version="1.0" encoding="UTF-8"?>
 
<?xml version="1.0" encoding="UTF-8"?>
Zeile 111: Zeile 150:
 
                     <link name="sp_vv_config_template" anchor="gui.vv.tpl.output.client.person" />
 
                     <link name="sp_vv_config_template" anchor="gui.vv.tpl.output.client.person" />
 
                     <text name="sp_vv_objectType">person</text>
 
                     <text name="sp_vv_objectType">person</text>
 +
                    <primitiveText name="objectType">citygovPerson</primitiveText>
  
 
                     <!--importierte Werte -->
 
                     <!--importierte Werte -->
                     <xsl:if test='contains(lower-case(bsTitle), "prof")'>
+
                     <text name="sp_vv_title"><xsl:value-of select="bsTitle"/></text><!--sp_ldap_title-->
                        <text name="sp_vv_title">sp_title_1137574665206</text><!--sp_ldap_title-->
+
                     <text name="sp_vv_salutation"><xsl:value-of select="bsSalutation"/></text><!--sp_ldap_salutation-->
                    </xsl:if>
 
                    <xsl:if test='contains(lower-case(bsTitle), "dr")'>
 
                        <text name="sp_vv_title">sp_title_1137574647737</text><!--sp_ldap_title-->
 
                     </xsl:if>
 
                    <xsl:if test="contains(lower-case(bsSalutation), 'herr')">
 
                        <text name="sp_vv_salutation">sp_salut_1137574647733</text><!--sp_ldap_salutation-->
 
                    </xsl:if>
 
                    <xsl:if test="contains(lower-case(bsSalutation),'frau')">
 
                        <text name="sp_vv_salutation">sp_salut_1137574654460</text><!--sp_ldap_salutation-->
 
                    </xsl:if>
 
 
 
                    <text name="sp_vv_personnel"><xsl:if test="contains(bsPersonnalNumber,'kein Eintrag')!=true()"><xsl:value-of select="bsPersonnalNumber"/></xsl:if></text><!--sp_ldap_personnalNumber-->
 
 
                     <text name="sp_vv_firstname"><xsl:if test="contains(bsFirstName,'kein Eintrag')!=true()"><xsl:value-of select="bsFirstName"/></xsl:if></text><!--sp_ldap_firstName-->
 
                     <text name="sp_vv_firstname"><xsl:if test="contains(bsFirstName,'kein Eintrag')!=true()"><xsl:value-of select="bsFirstName"/></xsl:if></text><!--sp_ldap_firstName-->
 
                     <text name="sp_vv_lastname"><xsl:if test="contains(bsLastName,'kein Eintrag')!=true()"><xsl:value-of select="bsLastName"/></xsl:if></text><!--sp_ldap_lastName-->
 
                     <text name="sp_vv_lastname"><xsl:if test="contains(bsLastName,'kein Eintrag')!=true()"><xsl:value-of select="bsLastName"/></xsl:if></text><!--sp_ldap_lastName-->
Zeile 150: Zeile 178:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
===XSLT Nutzerimport===
+
===Einfacher XSLT Nutzerimport: ''ldap-import.xslt''===
 +
In dieser Datei ist das Daten-Mapping zwischen LDAP und IES implementiert
 +
 
 
<syntaxhighlight lang="xml">
 
<syntaxhighlight lang="xml">
 
<?xml version="1.0" encoding="UTF-8"?>
 
<?xml version="1.0" encoding="UTF-8"?>
Zeile 182: Zeile 212:
 
</xsl:stylesheet>
 
</xsl:stylesheet>
  
 +
</syntaxhighlight>
 +
 +
===Komplexer XSLT Nutzerimport mit Links auf mehere Nutzerpools: ''ldap-import.xslt''===
 +
In dieser Datei ist das Daten-Mapping zwischen LDAP und IES implementiert
 +
 +
<syntaxhighlight lang="xml">
 +
<?xml version="1.0" encoding="UTF-8"?>
 +
 +
<xsl:stylesheet version="2.0"
 +
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 +
xmlns:utils="http://ies.sitepark.com/xip/utils"
 +
xmlns:saxon="http://saxon.sf.net/"
 +
extension-element-prefixes="utils saxon">
 +
 +
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
 +
 +
<xsl:template match="/">
 +
<xip>
 +
<xsl:for-each select="rowset/row">
 +
 +
<!-- Parent -->
 +
<xsl:variable name="parent">
 +
<xsl:choose>
 +
<xsl:when test="groupMembership = 'cn=Mitarbeiter,ou=Groups,o=SITEPARK'">users.sp.all</xsl:when>
 +
<xsl:when test="groupMembership = 'cn=Partner,ou=Groups,o=SITEPARK'">users.sp.partner</xsl:when>
 +
<xsl:otherwise></xsl:otherwise>
 +
</xsl:choose>
 +
</xsl:variable>
 +
 +
                                <!-- Vorname -->
 +
                                <xsl:variable name="firstname">
 +
                                        <xsl:choose>
 +
                                                <xsl:when test="i18nGN"><xsl:value-of select="i18nGN"/></xsl:when>
 +
                                                <xsl:otherwise><xsl:value-of select="givenName"/></xsl:otherwise>
 +
                                        </xsl:choose>
 +
                                </xsl:variable>
 +
 +
                                <!-- Nachname -->
 +
                                <xsl:variable name="lastname">
 +
                                        <xsl:choose>
 +
                                                <xsl:when test="i18nSN"><xsl:value-of select="i18nSN"/></xsl:when>
 +
                                                <xsl:otherwise><xsl:value-of select="sn"/></xsl:otherwise>
 +
                                        </xsl:choose>
 +
                                </xsl:variable>
 +
 +
<!-- Für Anrede -->
 +
<xsl:variable name="sex">
 +
<xsl:choose>
 +
<xsl:when test="gender = '1'">1</xsl:when>
 +
<xsl:when test="gender = '2'">0</xsl:when>
 +
<xsl:otherwise>-1</xsl:otherwise>
 +
</xsl:choose>
 +
</xsl:variable>
 +
 +
<!-- Login -->
 +
<xsl:variable name="login">
 +
<xsl:for-each select="cn">
 +
<xsl:if test="string-length(text()) = 8"><xsl:value-of select="."/></xsl:if>
 +
</xsl:for-each>
 +
</xsl:variable>
 +
 +
                                <!-- Email -->
 +
                                <xsl:variable name="prefix" select="lower-case(i18nGN[text()])"/>
 +
                                <xsl:variable name="email">
 +
                                        <xsl:for-each select="mail">
 +
                                                <xsl:if test='starts-with(lower-case(text()), $prefix)'>
 +
                                                        <xsl:value-of select="text()"/>
 +
                                                </xsl:if>
 +
                                        </xsl:for-each>
 +
                                </xsl:variable>
 +
 +
<xsl:if test="$login != '' and $parent != ''">
 +
 +
<user parent="{$parent}"
 +
anchor="users.ldap.{$login}"
 +
login="{$login}"
 +
email="{$email}"
 +
sex="{$sex}"
 +
firstname="{$firstname}"
 +
lastname="{$lastname}"
 +
ldap-server="1"
 +
ldap-dn="{dn}"
 +
/>
 +
 +
<!-- Gruppen-Zuordnung (Symlinks) -->
 +
 +
<!-- Mitarbeiter -->
 +
<xsl:if test="groupMembership = 'cn=Mitarbeiter,ou=Groups,o=SITEPARK'">
 +
<!-- Develop -->
 +
<xsl:if test="groupMembership = 'cn=DEVELOP,ou=Groups,o=SITEPARK'">
 +
<symbolic-link parent="users.sp.develop" anchor="users.ldap.{$login}" />
 +
</xsl:if>
 +
<!-- Support -->
 +
<xsl:if test="groupMembership = 'cn=SUPPORT,ou=Groups,o=SITEPARK'">
 +
<symbolic-link parent="users.sp.support" anchor="users.ldap.{$login}" />
 +
</xsl:if>
 +
 +
</xsl:if>
 +
<xsl:if test="groupMembership = 'cn=Partner,ou=Groups,o=SITEPARK'">
 +
<!-- Gold -->
 +
<xsl:if test="groupMembership = 'cn=gold,ou=Groups,o=SITEPARK'">
 +
<symbolic-link parent="users.sp.gold.all" anchor="users.ldap.{$login}" />
 +
</xsl:if>
 +
<!-- Silber -->
 +
<xsl:if test="groupMembership = 'cn=silver,ou=Groups,o=SITEPARK'">
 +
<symbolic-link parent="users.sp.silver.all" anchor="users.ldap.{$login}" />
 +
</xsl:if>
 +
<!-- Bronze -->
 +
<xsl:if test="groupMembership = 'cn=bronze,ou=Groups,o=SITEPARK'">
 +
<symbolic-link parent="users.sp.bronze.all" anchor="users.ldap.{$login}" />
 +
</xsl:if>
 +
</xsl:if>
 +
</xsl:if>
 +
</xsl:for-each>
 +
</xip>
 +
</xsl:template>
 +
</xsl:stylesheet>
 
</syntaxhighlight>
 
</syntaxhighlight>

Aktuelle Version vom 22. September 2023, 12:32 Uhr

Der Importer fragt die LDAP-Daten vom LDAP-Server ab und wandelt Sie in ein XML-Format um. Über eine spezifisch erstellte XSLT werden die XML-Daten in das XML-XIP Format transformiert (XIP ist ein von Sitepark entwickeltes XML-Format, um Daten in den IES zu importieren).

Konfiguration des LDAP-Servers

Die Verbindung zum LDAP-Server wird in IES-Admin unter dem Bereich LDAP konfiguriert. Diese Verbindung wird zur Abfragen der Nutzerdaten für den Import und für die Authentifizierung der Nutzer verwendet.

Die Konfigurationsdateien können z.B. in dem Verzeichnis

/srv/sitepark/ldap/

organisiert werden.

Aufruf des LDAP Imports

Aufruf des LDAP Imports z.B. unter Linux:

/srv/sitepark/bin/iesxip /srv/sitepark/ldap/import.xml

oder als Cronjob:

23 00 * * * /srv/sitepark/bin/iesxip /srv/sitepark/ldap/import.xml

Für Tests der Daten kann der Kommando iesxip mit folgenden Optionen aufgerufen werden:

--dumpXml (Daten nicht importieren, XML-Ausgabe in die Console)
--ignore-xslt (XSLT-Transformation nicht anwenden, XML-Rohdaten ausgeben)

XML Konfiguration: import.xml

import.xml Die Konfigurations-Datei des Imports. In dieser Datei sind folgende Konfigurationen enthalten:

  • Logging des Imports (Import Log in die Datei import.log)
  • Import Nutzer, über den die Nutzer/Artikel im IES gespeichert werden.
  • Import-Optionen: Allgemeine Einstellungen das z.B. neue Einträge angelegt und nicht mehr existierende gelöscht werden solle. Weiter wird hier angegeben welche XSLT-Datei das Daten-Mapping vornimmt (import.xslt) und die Synchronisations-Datei um erkennen zu können welche Datensätze gelöscht werden sollen.
  • LDAP-Optionen: Hier wird der LDAP-Filter angegeben um nur die Datensätze abzufragen, die auch importiert werden sollen. Weiter wird hier angegeben das zwei LDAP-Attribute base64 encodiert werden, da sie Binäredaten enthalten (sASLoginConfiguration, sASLoginConfigurationKey).
<?xml version="1.0" encoding="UTF-8"?>
<import id="ldapimport" name="Import LDAP User">
   <logging>
      <Appenders>
         <RollingFile   
            name="FILE"         
            fileName="${sys:sitepark.home}/import-ldap.log"
            filePattern="${sys:sitepark.home}/import-ldap-%d{dd-MM-yyyy}-%i.log.gz"
            append="true">      
            <PatternLayout>     
               <Pattern>%d %-5p %m%n</Pattern>
            </PatternLayout>    
            <Policies>          
               <TimeBasedTriggeringPolicy />
               <SizeBasedTriggeringPolicy size="10MB" />
            </Policies>
            <DefaultRolloverStrategy max="10" />
         </RollingFile> 
      </Appenders>
      <Loggers> 
         <Logger name="com.sitepark.ies" level="trace" additivity="false">
            <AppenderRef ref="FILE" />
         </Logger>      
      </Loggers>
   </logging>
   <ies-connection login="Wartung" password="secret" client="ies2work" module="LDAP Importer"/>
   <options>
      <createElements>true</createElements>
      <deleteWorkDir>true</deleteWorkDir>
      <createPools>true</createPools>
      <updatePools>true</updatePools>
      <updateElements>true</updateElements>
      <deletePools>true</deletePools>
      <deleteOnlyEmptyPools>true</deleteOnlyEmptyPools>
      <deleteElements>true</deleteElements>
      <xslt>${sitepark.home}/ldap/ldap-import.xslt</xslt>
      <syncFile>${sitepark.home}/ldap/ldap-import.sync</syncFile>
   </options>
    <source type="ldap" id="1">
	<encoding attribute="sASLoginConfiguration" encoding="base64"/>
	<encoding attribute="sASLoginConfigurationKey" encoding="base64"/>
        <query>
          <and>
            <ldap-query>
              <search-filter>(uid=quintama)</search-filter>
              <search-base>dc=sitepark,dc=com</search-base>
              <search-scope>subtree</search-scope>
              <!-- <limit>1000</limit> -->
            </ldap-query>
            <or>
              <ldap-group member-dn-attribute="uniqueMember">cn=CMS Redakteure,ou=groups,dc=sitepark,dc=com</ldap-group>
              <ldap-group member-dn-attribute="uniqueMember">cn=CMS Administratoren,ou=groups,dc=sitepark,dc=com</ldap-group>
            </or>
          </and>
        </query>
    </source>
</import>

XSLT Artikelimport: ldap-import.xslt

In dieser Datei ist das Daten-Mapping zwischen LDAP und IES implementiert

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xip="http://ies.sitepark.com/xip"
    extension-element-prefixes="xip">

    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>

    <!--
        xip:getFirstLetter(String s)

        Liefert das erste Zeichen der übergebenen Zeichenkette.
        Ist dieses Zeichen ein Großbuchstabe wird er in einen
        Kleinbuchstaben umgewandelt

        Bei den Umlauten ä, ö und ü wird a, o oder ü zurückgeliefert
    -->
    <xsl:function name="xip:getFirstLetter"> <xsl:param name="s"/>

        <!-- Erstes Zeichen ermitteln -->
        <xsl:variable name="fistLetter" select="substring($s,1,1)"/>
        <!-- in Kleinbuchstaben umwandeln -->
        <xsl:variable name="toLowerCase" select="lower-case($fistLetter)"/>
        <!-- Umlaute umwandeln und Zeichen zurückgeben -->
        <xsl:variable name="substituteFrom" select="'äöü'"/>
        <xsl:variable name="substituteTo"   select="'aou'"/>
        <xsl:value-of select="translate($toLowerCase, $substituteFrom, $substituteTo)"/>
    </xsl:function>

    <!--
        Erzeugt eine Map mit den Anfangsbuchstaben als Keys und jeweils einer Liste von Elementen mit
        den entsprechenden Anfangsbuchstaben im Element <bsLastname>
        a=[<row>,<row>,...]
        b=[<row>,<row>,...]
        c=...
        ...
        z=...
    -->
    <xsl:key name="keyLetter" match="row" use="xip:getFirstLetter(bsLastName)"/>

    <xsl:template match="/">
        <xip>
        <!-- Gruppiert die Elemente nach ihrem Anfangsbuchstaben (siehe xip:getFirstLetter()) -->
        <!-- Diese Methode mit XSLT zu gruppieren nennt sich 'Muenchian Method' (siehe: http://www.jenitennison.com/xslt/grouping/muenchian.html) -->

        <!-- Schleife über a,b,c,d -->
        <xsl:for-each select="//row[generate-id() = generate-id(key('keyLetter', xip:getFirstLetter(bsLastName))[1]) ]">

            <xsl:variable name="letter" select="xip:getFirstLetter(bsLastName)"/>

            <!-- Schleife über alle mit dem gleichen Anfangsbuchstaben -->
            <xsl:for-each select="key('keyLetter',$letter)">

                <!-- Eine row der LDAP-Daten in XIP-Artikel umwandeln   altes Template:  template.main.mitarbeiter  -->
                <article parent="vv.informationpool.mitarbeiter.{$letter}" anchor="ldap.import.{bsPersonnalNumber}" name="{cn}" filename="{cn}" template="gui.vv.tpl.output.client.person">

                    <!-- Statische Werte -->
                    <link name="sp_vv_config_template" anchor="gui.vv.tpl.output.client.person" />
                    <text name="sp_vv_objectType">person</text>
                    <primitiveText name="objectType">citygovPerson</primitiveText>

                    <!--importierte Werte -->
                    <text name="sp_vv_title"><xsl:value-of select="bsTitle"/></text><!--sp_ldap_title-->
                    <text name="sp_vv_salutation"><xsl:value-of select="bsSalutation"/></text><!--sp_ldap_salutation-->
                    <text name="sp_vv_firstname"><xsl:if test="contains(bsFirstName,'kein Eintrag')!=true()"><xsl:value-of select="bsFirstName"/></xsl:if></text><!--sp_ldap_firstName-->
                    <text name="sp_vv_lastname"><xsl:if test="contains(bsLastName,'kein Eintrag')!=true()"><xsl:value-of select="bsLastName"/></xsl:if></text><!--sp_ldap_lastName-->
                    <text name="sp_vv_mail"><xsl:if test="contains(bsMail,'kein Eintrag')!=true()"><xsl:value-of select="bsMail"/></xsl:if></text><!--sp_ldap_mail-->
                    <text name="sp_vv_publish_mail">true</text><!--sp_ldap_mail-->
                    <text name="sp_vv_street"><xsl:if test="contains(bsStreet,'kein Eintrag')!=true()"><xsl:value-of select="bsStreet"/></xsl:if></text><!--sp_ldap_street-->
                    <text name="sp_vv_postal_code"><xsl:if test="contains(bsZip,'kein Eintrag')!=true()"><xsl:value-of select="bsZip"/></xsl:if></text><!--sp_ldap_zip-->
                    <text name="sp_vv_city"><xsl:if test="contains(bsTown,'kein Eintrag')!=true()"><xsl:value-of select="bsTown"/></xsl:if></text><!--sp_ldap_town-->
                    <text name="sp_vv_roomNumber"><xsl:if test="contains(bsRoomFloor,'kein Eintrag')!=true()"><xsl:value-of select="bsRoomFloor"/></xsl:if></text><!--sp_ldap_roomFloor-->
                    <text name="sp_vv_phone"><xsl:if test="contains(bsPhoneComp,'kein Eintrag')!=true()"><xsl:value-of select="bsPhoneComp"/></xsl:if></text><!--sp_ldap_phoneComp-->
                    <text name="sp_vv_fax"><xsl:if test="contains(bsFaxComp,'kein Eintrag')!=true()"><xsl:value-of select="bsFaxComp"/></xsl:if></text><!--sp_ldap_faxComp-->
                    <text name="sp_vv_mobile"><xsl:if test="contains(bsMobile,'kein Eintrag')!=true()"><xsl:value-of select="bsMobile"/></xsl:if></text><!--sp_ldap_mobile-->
                    <text name="sp_vv_publish_mobile">true</text><!--sp_ldap_mobile-->
                    <text name="sp_vv_function"><xsl:if test="contains(bsFunction,'kein Eintrag')!=true()"><xsl:value-of select="bsFunction"/></xsl:if></text><!--sp_ldap_function-->

                </article>
            </xsl:for-each>
        </xsl:for-each>
        </xip>
    </xsl:template>
</xsl:stylesheet>

Einfacher XSLT Nutzerimport: ldap-import.xslt

In dieser Datei ist das Daten-Mapping zwischen LDAP und IES implementiert

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:utils="http://ies.sitepark.com/xip/utils"
    xmlns:saxon="http://saxon.sf.net/"
    extension-element-prefixes="utils saxon">

    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <xip>
            <userpool parent="system.root.pool.user" anchor="system.import.pool" name="Import">
                <xsl:for-each select="rowset/row">
		    <user parent="system.import.pool"
                                  anchor="system.import.{uid}"
				  login="{uid}"
                                  email="{mail}"
                                  type="3003"
                                  firstname="{firstname}"
                                  lastname="{lastname}" 
				  ldap-server="2"
                                  ldap-dn="{dn}"
                    />
                </xsl:for-each>
            </userpool>
        </xip>
    </xsl:template>
</xsl:stylesheet>

Komplexer XSLT Nutzerimport mit Links auf mehere Nutzerpools: ldap-import.xslt

In dieser Datei ist das Daten-Mapping zwischen LDAP und IES implementiert

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="2.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:utils="http://ies.sitepark.com/xip/utils"
	xmlns:saxon="http://saxon.sf.net/"
	extension-element-prefixes="utils saxon">
 
	<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
 
	<xsl:template match="/">
		<xip>
			<xsl:for-each select="rowset/row">

				<!-- Parent -->
				<xsl:variable name="parent">
					<xsl:choose>
						<xsl:when test="groupMembership = 'cn=Mitarbeiter,ou=Groups,o=SITEPARK'">users.sp.all</xsl:when>
						<xsl:when test="groupMembership = 'cn=Partner,ou=Groups,o=SITEPARK'">users.sp.partner</xsl:when>
						<xsl:otherwise></xsl:otherwise>
					</xsl:choose>
				</xsl:variable>

                                <!-- Vorname -->
                                <xsl:variable name="firstname">
                                        <xsl:choose>
                                                <xsl:when test="i18nGN"><xsl:value-of select="i18nGN"/></xsl:when>
                                                <xsl:otherwise><xsl:value-of select="givenName"/></xsl:otherwise>
                                        </xsl:choose>
                                </xsl:variable>

                                <!-- Nachname -->
                                <xsl:variable name="lastname">
                                        <xsl:choose>
                                                <xsl:when test="i18nSN"><xsl:value-of select="i18nSN"/></xsl:when>
                                                <xsl:otherwise><xsl:value-of select="sn"/></xsl:otherwise>
                                        </xsl:choose>
                                </xsl:variable>

				<!-- Für Anrede -->
				<xsl:variable name="sex">
					<xsl:choose>
						<xsl:when test="gender = '1'">1</xsl:when>
						<xsl:when test="gender = '2'">0</xsl:when>
						<xsl:otherwise>-1</xsl:otherwise>
					</xsl:choose>
				</xsl:variable>

				<!-- Login -->
				<xsl:variable name="login">
					<xsl:for-each select="cn">
						<xsl:if test="string-length(text()) = 8"><xsl:value-of select="."/></xsl:if>
					</xsl:for-each>
				</xsl:variable>

                                <!-- Email -->
                                <xsl:variable name="prefix" select="lower-case(i18nGN[text()])"/>
                                <xsl:variable name="email">
                                        <xsl:for-each select="mail">
                                                <xsl:if test='starts-with(lower-case(text()), $prefix)'>
                                                        <xsl:value-of select="text()"/>
                                                </xsl:if>
                                        </xsl:for-each>
                                </xsl:variable>
				
				<xsl:if test="$login != '' and $parent != ''">

					<user parent="{$parent}"
						anchor="users.ldap.{$login}"
						login="{$login}"
						email="{$email}"
						sex="{$sex}"
						firstname="{$firstname}"
						lastname="{$lastname}" 
						ldap-server="1"
						ldap-dn="{dn}"
					/>

					<!-- Gruppen-Zuordnung (Symlinks) -->

					<!-- Mitarbeiter -->
					<xsl:if test="groupMembership = 'cn=Mitarbeiter,ou=Groups,o=SITEPARK'">
						<!-- Develop -->
						<xsl:if test="groupMembership = 'cn=DEVELOP,ou=Groups,o=SITEPARK'">
							<symbolic-link parent="users.sp.develop" anchor="users.ldap.{$login}" />
						</xsl:if>
						<!-- Support -->
						<xsl:if test="groupMembership = 'cn=SUPPORT,ou=Groups,o=SITEPARK'">
							<symbolic-link parent="users.sp.support" anchor="users.ldap.{$login}" />
						</xsl:if>

					</xsl:if>
					<xsl:if test="groupMembership = 'cn=Partner,ou=Groups,o=SITEPARK'">
						<!-- Gold -->
						<xsl:if test="groupMembership = 'cn=gold,ou=Groups,o=SITEPARK'">
							<symbolic-link parent="users.sp.gold.all" anchor="users.ldap.{$login}" />
						</xsl:if>
						<!-- Silber -->
						<xsl:if test="groupMembership = 'cn=silver,ou=Groups,o=SITEPARK'">
							<symbolic-link parent="users.sp.silver.all" anchor="users.ldap.{$login}" />
						</xsl:if>
						<!-- Bronze -->
						<xsl:if test="groupMembership = 'cn=bronze,ou=Groups,o=SITEPARK'">
							<symbolic-link parent="users.sp.bronze.all" anchor="users.ldap.{$login}" />
						</xsl:if>
					</xsl:if>
				</xsl:if>
			</xsl:for-each>
		</xip>
	</xsl:template>
</xsl:stylesheet>