Speicherpfad Definition
Diese Dokumentfunktion wird verwendet, um beim Speichern des Dokuments im Standard-Speicherdialog einen Namen und einen Dateispeicherort vorzuschlagen. Es ist möglich, den Dateinamen mithilfe von Profildaten oder Dokument-Parameter zusammenzustellen. Das geschieht in der Konfiguration mittels Zugriff über XSLT und XPath auf Elemente aus dem CustomXMLPart.
Basis Konfiguration
Hier eine einfache Beispielkonfiguration:
<SavePathConfiguration>
<SaveNewDocumentOnOpen>false</SaveNewDocumentOnOpen>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" />
<!-- parameters from outside this stylesheet
can be passed by an interface
they are not used in this configuration -->
<xsl:param name="filename" />
<xsl:param name="path" />
<xsl:param name="pathAndFilename" />
<xsl:param name="targetFolderFileList" />
<xsl:template match="/">
<xsl:variable name="Path" select="'C:\temp\'" />
<xsl:variable name="Filename" select="'Test_FileName'" />
<xsl:element name="DocumentFunction" namespace="">
<xsl:attribute name="name">SavePathDefinition</xsl:attribute>
<xsl:element name="Path" namespace="">
<xsl:value-of select="concat($Path, $Filename,'.docx')" />
</xsl:element>
<xsl:element name="CreateFolder" namespace="">false</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
</SavePathConfiguration>
Resultat:
Das bewirkt, dass durch das XSLT-Stylesheet das folgende XML-Dokument erzeugt wird:
<DocumentFunction name="SavePathDefinition">
<Path>C:\temp\Test_FileName.docx</Path>
<CreateFolder>false</CreateFolder>
</DocumentFunction>
Dieses wird wiederum von OneOffixx so interpretiert, dass im Speichern-Dialog der Pfad "C:\temp" und der Dateiname "Test_FileName.docx" vorgeschlagen wird. Wenn der Ordner "C:\temp" nicht existiert, soll der Ordner in diesem Beispiel nicht erstellt werden, da CreateFolder
auf false
gesetzt ist.
Speichern-unter-Dialog:
Mit der Option SaveNewDocumentOnOpen
kann definiert werden, ob der Benutzer nach dem Generieren eines Dokuments zum Speichern aufgefordert werden soll, indem ihm der Speichern-Dialog angezeigt wird.
Bestehende Speicherpfade und Dateinamen
Caution
Bei dieser Konfiguration: Wenn bei Dokumenten, die bereits gespeichert wurden (z. B. TestDok.docx auf dem Desktop), der Speichern-Dialog aufgerufen wird, so wird erneut "Test_FileName" unter C:\temp\ vorgeschlagen und nicht wie gewohnt der bestehende Name am bestehenden Speicherort ("TestDok" auf dem Desktop).
Erweiterte Konfiguration
Hier ein Beispiel einer Konfiguration mit deutlich mehr Funktionalität:
<SavePathConfiguration>
<SaveNewDocumentOnOpen>false</SaveNewDocumentOnOpen>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" />
<!-- parameters from outside this stylesheet
can be passed by an interface
they are not used in this configuration -->
<xsl:param name="filename" />
<xsl:param name="path" />
<xsl:param name="pathAndFilename" />
<xsl:param name="targetFolderFileList" />
<xsl:template match="/">
<!-- add OneOffixx data -->
<xsl:variable name="CustomElements.SavePathConfig.FileName" select="//Text[@id='CustomElements.SavePathConfig.FileName']" />
<xsl:variable name="CustomElements.SavePathConfig.Path" select="//Text[@id='CustomElements.SavePathConfig.Path']" />
<xsl:variable name="CustomElements.SavePathConfig.Path_NoSpace">
<xsl:if test="not($CustomElements.SavePathConfig.Path = ' ')">
<xsl:value-of select="$CustomElements.SavePathConfig.Path" />
</xsl:if>
</xsl:variable>
<xsl:variable name="CustomElements.SavePathConfig.UpdateFileName" select="//Text[@id='CustomElements.SavePathConfig.UpdateFileName']" />
<xsl:variable name="DocumentProperties.DocumentName" select="//Text[@id='DocumentProperties.DocumentName']" />
<xsl:variable name="DocumentProperties.SavePath" select="//Text[@id='DocumentProperties.SavePath']" />
<xsl:variable name="DocumentProperties.SavePath_NoSpace_PathOnly">
<xsl:if test="not($DocumentProperties.SavePath = ' ')">
<xsl:call-template name="substring-before-last">
<xsl:with-param name="string" select="$DocumentProperties.SavePath" />
<xsl:with-param name="delimiter" select="'\'" />
</xsl:call-template>
<xsl:text>\</xsl:text>
</xsl:if>
</xsl:variable>
<!-- evaluate boolean variables -->
<xsl:variable name="documentWasSaved" select="boolean(normalize-space($DocumentProperties.SavePath_NoSpace_PathOnly) != '')" />
<xsl:variable name="updateFileName" select="boolean($CustomElements.SavePathConfig.UpdateFileName = 'true')" />
<xsl:variable name="keepExistingPath" select="boolean($documentWasSaved)" />
<xsl:variable name="keepExistingName" select="boolean($documentWasSaved and not($updateFileName))" />
<!-- set Path and Filename -->
<xsl:variable name="Path">
<xsl:choose>
<xsl:when test="$keepExistingPath">
<xsl:value-of select="$DocumentProperties.SavePath_NoSpace_PathOnly" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$CustomElements.SavePathConfig.Path_NoSpace" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="Filename">
<xsl:choose>
<xsl:when test="$keepExistingName">
<xsl:value-of select="$DocumentProperties.DocumentName" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="translate($CustomElements.SavePathConfig.FileName, ' ', '_')" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- generate output XML -->
<xsl:call-template name="generateOutputXML">
<xsl:with-param name="path" select="concat($Path, $Filename,'.docx')" />
</xsl:call-template>
</xsl:template>
<!-- generates the required output -->
<xsl:template name="generateOutputXML">
<xsl:param name="path" />
<xsl:param name="createFolder" />
<xsl:element name="DocumentFunction" namespace="">
<xsl:attribute name="name">SavePathDefinition</xsl:attribute>
<xsl:element name="Path" namespace="">
<xsl:value-of select="$path" />
</xsl:element>
<xsl:element name="CreateFolder" namespace="">
<xsl:choose>
<xsl:when test="$createFolder">
<xsl:value-of select="$createFolder" />
</xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:element>
</xsl:template>
<!-- determines the substring before last occurence of a specific delimiter -->
<xsl:template name="substring-before-last">
<xsl:param name="string" />
<xsl:param name="delimiter" />
<xsl:choose>
<xsl:when test="contains($string, $delimiter)">
<xsl:value-of select="substring-before($string, $delimiter)" />
<xsl:choose>
<xsl:when test="contains(substring-after($string, $delimiter), $delimiter)">
<xsl:value-of select="$delimiter" />
</xsl:when>
</xsl:choose>
<xsl:call-template name="substring-before-last">
<xsl:with-param name="string" select="substring-after($string, $delimiter)" />
<xsl:with-param name="delimiter" select="$delimiter" />
</xsl:call-template>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
</SavePathConfiguration>
Mit der Funktion translate(...)
werden in diesem Beispiel alle Leerschläge mit Unterstrichen ("_") ersetzt.
Einbindung von Skripten:
Hier wird auf folgende Skripte zugegriffen:
<CustomDataNode id="SavePathConfig.FileName">
<Element id="DocParam.DateOfChange" fFormatingDate="yyMMdd" textafter=" " />
<Text>Einverständniserklärung </Text>
<Element id="Profile.User.LastName" separator=" " />
<Element id="Profile.User.FirstName" />
</CustomDataNode>
<CustomDataNode id="SavePathConfig.Path">
<Text>S:\Personaldossier\</Text>
</CustomDataNode>
<CustomDataNode id="SavePathConfig.UpdateFileName">
<Text>false</Text>
</CustomDataNode>
Die Funktion der einzelnen Skripte sollte anhand des Namens selbsterklärend sein. Diese Skripte müssen auf jeder Vorlage verfügbar sein, bei der die "Speicherpfad Definition" mit dieser Konfiguration angehängt ist.
Zugriff auf "Toolboxen im Editormodus":
Zudem wird auf diese OneOffixx-Inhalte zugegriffen:
- DocumentProperties.SavePath
- DocumentProperties.DocumentName
Damit diese Inhalte zur Verfügung stehen, muss die Dokumentfunktion Toolboxen im Editormodus angehängt sein (in der Regel ist sie schon in der Layoutvorlage angehängt, falls im Dokument ein Logo enthalten ist.)
Bestehende Speicherpfade und Dateinamen:
Mit dem obigen Einbeziehen des bestehenden Speicherpfads und Dokumentnamens wird bei bereits gespeicherten Dokumenten bewirkt, dass der bestehende Speicherpfad und Dateinamen verwendet wird (siehe "Bestehende Speicherpfade und Dateinamen" bei der Basis Konfiguration oben).
Ein Problem, das hier aber bleibt: Wenn eine Word-Datei verschoben oder umbenannt wird, werden die Felder DocumentProperties.SavePath
und DocumentProperties.DocumentName
nicht aktualisiert. In diesem Fall wird der alte Speicherpfad und Dateinamen vorgeschlagen, der bei der letzten Speicherung noch aktuell war.