Frage

Ich muss eine Suche durchführen und ersetzen mit XSLT 1.0, das ist wirklich geeignet, um reguläre Ausdrücke.Leider sind diese nicht verfügbar sind 1.0 und ich bin auch nicht in der Lage zu verwenden Bibliotheken wie EXSLT aufgrund von Sicherheitseinstellungen, die ich nicht ändern kann.

Der string, mit dem ich arbeite sieht wie folgt aus:

19;#John Smith;#17;#Ben Reynolds;#1;#Terry Jackson

Ich brauche zu ersetzen, die zahlen und ; # Zeichen mit ,.Für das Beispiel oben würde sich ändern:

John Smith, Ben Reynolds, Terry Jackson

Ich weiß, eine rekursive Funktion string ist erforderlich, wohl mit substring und zu übersetzen, aber ich bin mir nicht sicher, wo zu beginnen.

Hat jemand ein paar Tipps, wie Sie diese Arbeit heraus?Hier ist, was ich habe angefangen mit:

<xsl:template name="TrimMulti">
    <xsl:param name="FullString" />
    <xsl:variable name="NormalizedString">
        <xsl:value-of select="normalize-space($FullString)" />
    </xsl:variable>
    <xsl:variable name="Hash">#</xsl:variable>
    <xsl:choose>
        <xsl:when test="contains($NormalizedString, $Hash)">
            <!-- Do something and call TrimMulti -->
        </xsl:when>
    </xsl:choose>
</xsl:template>
War es hilfreich?

Lösung

Ich hoffe, Sie haben nicht vereinfacht das problem zu viel zu Fragen, es SO, weil das sollte nicht sein, dass viel von einem problem.

Sie können eine Vorlage definieren und rekursiv nennen Sie es, so lange wie Sie halten Sie die Eingabe-Zeichenfolge, die das format konsistent ist.

Für Beispiel,

<xsl:template name="TrimMulti">
  <xsl:param name="InputString"/>
  <xsl:variable name="RemainingString" 
    select="substring-after($InputString,';#')"/>
  <xsl:choose>
    <xsl:when test="contains($RemainingString,';#')">
      <xsl:value-of 
        select="substring-before($RemainingString,';#')"/>
      <xsl:text>, </xsl:text>
      <xsl:call-template name="TrimMulti">
        <xsl:with-param 
          name="InputString"
          select="substring-after($RemainingString,';#')"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$RemainingString"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

Getestet habe ich diese Vorlage mit dem folgenden Aufruf:

<xsl:template match="/">
  <xsl:call-template name="TrimMulti">
    <xsl:with-param name="InputString">19;#John Smith;#17;#Ben Reynolds;#1;#Terry Jackson</xsl:with-param>
  </xsl:call-template>
</xsl:template>

Und bekam folgende Ausgabe:

John Smith, Ben Reynolds, Terry Jackson

Das scheint das zu sein, was Sie suchen.

Die Erklärung, was es tut, ist leicht zu erklären, wenn Sie vertraut sind mit der funktionalen Programmierung.Die InputString parameter immer in der form [number];#[name];#[rest of string].Jeder Aufruf der TrimMulti Vorlage schneidet die [number];# Teil und Drucke aus den [name] Teil, geht dann die restlichen Ausdruck rekursiv auf sich selbst.

Die Basis Fall ist, wenn InputString in der form [number];#[name], in welchem Falle die RemainingString variable nicht enthalten ;#.Da wir wissen, dass dies das Ende der Eingabe, wir don ' T-Ausgabe ein Komma dieser Zeit.

Andere Tipps

Wenn das ';' und ‚#‘ Zeichen in der Eingabe nicht gültig, weil sie delimiters warum dann würden die nicht-Funktion Arbeit übersetzen? Es könnte hässlich sein (Sie alle gültigen Zeichen im zweiten Argument angeben müssen und sie im dritten Argument wiederholen), aber es wäre einfacher zu debuggen sein.

translate($InputString, ';#abcdefghijklmnopqrstuvABCDEFGHIJKLMNOPQRSTUZ0123456789,- ', ', abcdefghijklmnopqrstuvABCDEFGHIJKLMNOPQRSTUZ0123456789,- ')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top