2016-12-08 5 views
0

Ich führe diesen Code, wo ich die Datetime in '@datetime' nach meinen Bedürfnissen formatiere. Dieser Code funktioniert perfekt.XSLT 1.0 Erstellen von Vorlagen und Variablen

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

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

<xsl:strip-space elements="*"/> 

<xsl:template match ="transcript/call"> 

    <xsl:variable name="datestr" select="substring-before(@datetime,' UTC')" /> 

    <xsl:variable name="MMM" select="format-number(string-length(substring-before('JanFebMarAprMayJunJulAugSepOctNovDec',substring(substring($datestr,1,3),1,3))) div 3 + 1,'00')"/> 

    <xsl:variable name="D" select="format-number(floor(substring($datestr,5,1)),'00')" /> 

    <xsl:variable name="YYYY" select="substring($datestr,8,4)" /> 

    <xsl:variable name="hh" select="substring($datestr,13,2)" /> 

    <xsl:variable name="mm" select="substring($datestr,16,2)" /> 

    <xsl:variable name="ss" select="substring($datestr,19,2)" /> 

    <!-- <xsl:variable name="DateTimeFormatted" select="concat($YYYY,'-', $MMM, '-', $D, 'T', $hh, ':', $mm, ':', $ss, 'Z')" /> --> 


Your chat transcript from Univ100 @ Student dated <xsl:value-of select="concat($YYYY,'-', $MMM, '-', $D, 'T', $hh, ':', $mm, ':', $ss, 'Z')" /> 

------------------------------------------------------------------------------------- 

</xsl:template> 

<xsl:template match ="transcript/say"> 

<xsl:if test ="./@source ='customer'"> 

[<xsl:value-of select ="@datetime" />] <xsl:value-of select ="@name" /> says: <xsl:value-of select ="." disable-output-escaping="yes" /></xsl:if> 

<xsl:if test ="./@source ='agent'"> 

[<xsl:value-of select ="@datetime" />] Student Officer says: <xsl:value-of select ="." disable-output-escaping="yes" /></xsl:if> 

<xsl:if test ="./@source ='system'"> 

<xsl:if test ="./@display ='true'"> 

[<xsl:value-of select ="@datetime" />] System: <xsl:value-of select ="." disable-output-escaping="yes" /> 

</xsl:if> 

</xsl:if> 

</xsl:template> 

<xsl:template match ="transcript/url"> 

<xsl:if test ="./@source ='customer'"> 

[<xsl:value-of select ="@datetime" />] <xsl:value-of select ="@name" /> sends: <xsl:value-of select ="." disable-output-escaping="yes" /> 

</xsl:if> 

<xsl:if test ="./@source ='agent'"> 

[<xsl:value-of select ="@datetime" />] Student Officer sends: <xsl:value-of select ="." disable-output-escaping="yes" /> 

</xsl:if> 

<xsl:if test ="./@source ='system'"> 

<xsl:if test ="./@display ='true'"> 

[<xsl:value-of select ="@datetime" />] System: <xsl:value-of select ="." disable-output-escaping="yes" /> 

</xsl:if> 

</xsl:if> 

</xsl:template> 

<xsl:template match ="transcript/event"> 

</xsl:template> 

<xsl:template match ="parameters"> 



Univ100 

</xsl:template> 

</xsl:stylesheet> 

Allerdings, wenn ich die folgenden Änderungen vornehmen, um eine andere Vorlage für die Formatierung zu machen, die einen Parameter akzeptiert, und gibt den formatierten String, also kann ich es mehrfach verwenden und bei Bedarf in Dieses Chat-Protokoll.

Ich habe die folgenden Änderungen vorgenommen, aber der Code funktioniert nicht.

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

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

<xsl:strip-space elements="*"/> 

<xsl:template name="formatter"> 
    <xsl:param name="datestr"/> 

    <!-- <xsl:variable name="datestr" select="substring-before(@datetime,' UTC')" /> --> 

    <xsl:variable name="MMM" select="format-number(string-length(substring-before('JanFebMarAprMayJunJulAugSepOctNovDec',substring(substring($datestr,1,3),1,3))) div 3 + 1,'00')"/> 

    <xsl:variable name="D" select="format-number(floor(substring($datestr,5,1)),'00')" /> 

    <xsl:variable name="YYYY" select="substring($datestr,8,4)" /> 

    <xsl:variable name="hh" select="substring($datestr,13,2)" /> 

    <xsl:variable name="mm" select="substring($datestr,16,2)" /> 

    <xsl:variable name="ss" select="substring($datestr,19,2)" /> 

    <!-- <xsl:variable name="DateTimeFormatted" select="concat($YYYY,'-', $MMM, '-', $D, 'T', $hh, ':', $mm, ':', $ss, 'Z')" /> --> 
    <xsl:value-of select="concat($YYYY,'-', $MMM, '-', $D, 'T', $hh, ':', $mm, ':', $ss, 'Z')" /> 

</xsl:template> 

<xsl:template match ="transcript/call"> 
    <xsl:variable name="returnValue"> 
    <xsl:call-template name="formatter"> 
     <xsl:with-param name="datestr" select="@datetime"></xsl:with-param> 
    </xsl:call-template> 
    </xsl:variable> 

Your chat transcript from Univ100 @ Student dated <xsl:value-of select="$returnValue"/> 

------------------------------------------------------------------------------------- 

</xsl:template> 

<xsl:template match ="transcript/say"> 

<xsl:if test ="./@source ='customer'"> 

[<xsl:value-of select ="@datetime" />] <xsl:value-of select ="@name" /> says: <xsl:value-of select ="." disable-output-escaping="yes" /></xsl:if> 

<xsl:if test ="./@source ='agent'"> 

[<xsl:value-of select ="@datetime" />] Student Officer says: <xsl:value-of select ="." disable-output-escaping="yes" /></xsl:if> 

<xsl:if test ="./@source ='system'"> 

<xsl:if test ="./@display ='true'"> 

[<xsl:value-of select ="@datetime" />] System: <xsl:value-of select ="." disable-output-escaping="yes" /> 

</xsl:if> 

</xsl:if> 

</xsl:template> 

<xsl:template match ="transcript/url"> 

<xsl:if test ="./@source ='customer'"> 

[<xsl:value-of select ="@datetime" />] <xsl:value-of select ="@name" /> sends: <xsl:value-of select ="." disable-output-escaping="yes" /> 

</xsl:if> 

<xsl:if test ="./@source ='agent'"> 

[<xsl:value-of select ="@datetime" />] Student Officer sends: <xsl:value-of select ="." disable-output-escaping="yes" /> 

</xsl:if> 

<xsl:if test ="./@source ='system'"> 

<xsl:if test ="./@display ='true'"> 

[<xsl:value-of select ="@datetime" />] System: <xsl:value-of select ="." disable-output-escaping="yes" /> 

</xsl:if> 

</xsl:if> 

</xsl:template> 

<xsl:template match ="transcript/event"> 

</xsl:template> 

<xsl:template match ="parameters"> 



Univ100 

</xsl:template> 

</xsl:stylesheet> 

Ich bin sehr neu 1,0 bis XSLT und ich habe daran zu arbeiten, wie ich keine andere Wahl haben zu ändern oder die Version zu aktualisieren, kann ich arbeiten nur auf reine XSLT 1.0. Dies ist die einzige Kontrolle, die ich über das Projekt habe, ich habe keinen Zugriff auf den DB-Server, die XML-Datei, die diesen XLST oder irgendeinen anderen Aspekt des Projekts verwendet.

Jede Hilfe wäre willkommen.

+1

Bitte zeigen Sie uns ein Beispiel für die XML-Eingabe und die erwartete Ausgabe - siehe: [mcve]. Wenn Sie keinen direkten Zugriff auf die XML-Datei haben, verwenden Sie die Vorlage * identity transform *, um sie zu erhalten. –

Antwort

0

<xsl:value-of select="@datetime"/> wird nicht Ihre Vorlage aufrufen. Rewrite Ihre „Formatierer“ Vorlage @datetime übereinstimmen und es dann rufen mit xsl:apply-templates:

<xsl:template match="@datetime"> 
    <xsl:variable name="MMM" select="format-number(string-length(substring-before('JanFebMarAprMayJunJulAugSepOctNovDec',substring(substring(.,1,3),1,3))) div 3 + 1,'00')"/> 
    <xsl:variable name="D" select="format-number(floor(substring(.,5,2)),'00')" /> 
    <xsl:variable name="YYYY" select="substring(.,8,4)" /> 
    <xsl:variable name="hh" select="substring(.,13,2)" /> 
    <xsl:variable name="mm" select="substring(.,16,2)" /> 
    <xsl:variable name="ss" select="substring(.,19,2)" /> 
    <xsl:value-of select="concat($YYYY,'-', $MMM, '-', $D, 'T', $hh, ':', $mm, ':', $ss, 'Z')" /> 
</xsl:template> 

Beachten Sie, dass diese Vorlage auf das @datetime Attribut verweist, dass es passt mit, die x-Weg kurzerhand für current() ist „“.

Dann aktualisieren die Ihre anderen Vorlagen xsl:apply-templates zu verwenden:

<xsl:template match ="transcript/call"> 
    Your chat transcript from Univ100 @ Student dated <xsl:apply-templates select="@datetime"/> 

    ------------------------------------------------------------------------------------- 

</xsl:template> 

<xsl:template match ="transcript/say"> 
    <xsl:if test ="./@source ='customer'"> 
     [<xsl:apply-templates select ="@datetime" />] <xsl:value-of select ="@name" /> says: <xsl:value-of select ="." /> 
    </xsl:if> 
    <xsl:if test ="./@source ='agent'"> 
     [<xsl:apply-templates select ="@datetime" />] Student Officer says: <xsl:value-of select ="." /> 
    </xsl:if> 
    <xsl:if test ="./@source ='system'"> 
     <xsl:if test ="./@display ='true'"> 
      [<xsl:apply-templates select ="@datetime" />] System: <xsl:value-of select ="." /> 
     </xsl:if> 
    </xsl:if> 
</xsl:template> 

Und so weiter ...

Unrelated: Ich nehme zur Kenntnis, dass Ihr Formatierer den Tag mit format-number(floor(substring(.,5,1)),'00') auswählt. Ist das richtig? Funktioniert es für zweistellige Tage?

+0

Vielen Dank, das funktioniert wie ein Zauber! über den zweistelligen Tag, danke, dass Sie darauf hingewiesen haben, wird sich entsprechend ändern. –

+0

können Sie mir helfen, diese formatierte Zeichenfolge in eine Variable zu setzen? Ich versuchte das: '' '' '' '' 'Ihr Chat-Protokoll von UP100 @ UP Polizei datiert ' –

+0

Das sieht OK für mich aus. Funktioniert es wie erwartet? Beachten Sie, dass Sie einfach '' mehrmals aufrufen können, wenn Sie möchten, anstatt eine Variable zu verwenden. – teppic

Verwandte Themen