Frage

Ist es möglich, einen Tag bei niedriger oberen Gehäuse Grenzen zu spalten d zum Beispiel Tag ‚UserLicenseCode‘ sollte ‚User License-Code‘ umgewandelt werden so dass die Spaltenüberschriften schauen ein wenig schöner.

Ich habe so etwas wie dies in der Vergangenheit getan Perls regulären Ausdrücken, aber XSLT ist ein ganz neues Ballspiel für mich.

Alle Hinweise in einer solchen Vorlage erstellen würde sehr geschätzt werden!

Danke Krishna

War es hilfreich?

Lösung

Mit Rekursion ist es möglich, einen String in XSLT zu Fuß durch jedes Zeichen zu bewerten. Um dies zu tun, erstellen Sie eine neue Vorlage, die nur einen String-Parameter akzeptiert. Überprüfen Sie das erste Zeichen, und wenn es ein Großbuchstaben, schreiben einen Raum. Dann das Zeichen schreiben. Dann wieder die Vorlage rufen Sie mit den verbleibenden Zeichen in einem einzelnen String. Dies würde dazu führen, was Sie tun mögen.

Das würde den Zeiger sein. Ich werde einige Zeit brauchen, um die Vorlage zu erarbeiten. :-)


Es dauerte einige Tests, vor allem den Raum innerhalb der ganzen Sache zu bekommen. (Ich ein Zeichen dafür missbraucht!) Aber dieser Code sollte Ihnen eine Idee geben ...

Ich habe diese XML:

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

und dann dieses Sheet:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output method="text"/>
    <xsl:variable name="Space">*</xsl:variable>
    <xsl:template match="blah">
    <xsl:variable name="Split">
        <xsl:call-template name="Split">
            <xsl:with-param name="Value" select="."/>
            <xsl:with-param name="First" select="true()"/>
        </xsl:call-template></xsl:variable>
        <xsl:value-of select="translate($Split, '*', ' ')" />
    </xsl:template>
    <xsl:template name="Split">
        <xsl:param name="Value"/>
        <xsl:param name="First" select="false()"/>
        <xsl:if test="$Value!=''">
            <xsl:variable name="FirstChar" select="substring($Value, 1, 1)"/>
            <xsl:variable name="Rest" select="substring-after($Value, $FirstChar)"/>
                <xsl:if test="not($First)">
                    <xsl:if test="translate($FirstChar, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '..........................')= '.'">
                        <xsl:value-of select="$Space"/>
                    </xsl:if>
                </xsl:if>
                <xsl:value-of select="$FirstChar"/>
                <xsl:call-template name="Split">
                    <xsl:with-param name="Value" select="$Rest"/>
                </xsl:call-template>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

und ich habe dies als Ergebnis:

User License Code

Halten Sie daran, dass Räume und andere Leerraumzeichen dazu neigen, weg von XML werden abgezogen, weshalb ich ein ‚*‘ stattdessen verwendet, die ich in einen Raum übersetzt.

Natürlich könnte dieser Code verbessert werden. Es ist, was ich mit in 10 Minuten Arbeit kommen kann. In anderen Sprachen, würde es weniger Zeilen Code nehmen, aber es ist immer noch recht schnell in XSLT, um die Menge an Codezeilen unter Berücksichtigung es enthält.

Andere Tipps

Eine XSLT + FXSL Lösung (in XSLT 2.0, aber fast der gleichen Code wird mit XSLT 1.0 und FXSL 1.x arbeiten :

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://fxsl.sf.net/"
xmlns:testmap="testmap"
exclude-result-prefixes="f testmap"
>
   <xsl:import href="../f/func-str-dvc-map.xsl"/>
   <testmap:testmap/>

   <xsl:output omit-xml-declaration="yes" indent="yes"/>

   <xsl:template match="/">
     <xsl:variable name="vTestMap" select="document('')/*/testmap:*[1]"/>

     '<xsl:value-of select="f:str-map($vTestMap, 'UserLicenseCode')"
       />'
   </xsl:template>

    <xsl:template name="mySplit" match="*[namespace-uri() = 'testmap']"
     mode="f:FXSL">
      <xsl:param name="arg1"/>

      <xsl:value-of select=
       "if(lower-case($arg1) ne $arg1)
         then concat(' ', $arg1)
         else $arg1
       "/>
    </xsl:template>
</xsl:stylesheet>

Wenn die obige Transformation auf einer beliebigen Quelle XML-Dokument angewendet wird (nicht benutzt), das erwartete korrekte Ergebnis erzeugt:

'User License Code'

Hinweis: :

  1. Wir sind mit der DVC-Version des FXSL Funktion / template str-map() . Dies ist eine Funktion höherer Ordnung (HOF), die zwei Argumente nimmt: eine andere Funktion und eine Zeichenfolge. str-map() wendet die Funktion auf jedes Zeichen der Zeichenfolge und gibt die Verkettung der Ergebnisse.

  2. Da die Klein () Funktion (in der XSLT 2.0-Version) verwendet wird, werden wir nicht nur auf das lateinische Alphabet beschränkt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top