2016-08-05 59 views
0

Ich muss ASCII-Wert von Zeichen und ASCII-Code zurück in Zeichen konvertieren, wenn es bestimmte Bedingungen erfüllt. SoString-zu-Codepoints (String) entspricht in XSLT 1.0

stieß ich auf diese Funktionen:

string-to-codepoints(string)

und

codepoints-to-string((int,int,...))

in XSLT bereitgestellt 2.0 (oder besser gesagt XPath 2.0) Aber leider muss ich XSLT 1.0 verwenden für diese Aufgabe.

So ist meine Frage

Gibt es eine gleichwertige dieser Funktionen in XSLT 1.0? Wenn nicht, können wir es entwerfen? Können mir Experten hier helfen?

Vielen Dank im Voraus

+0

Nun, es gibt nur ein paar ASCII-Zeichen. Wenn Sie wirklich nur an ASCII-Zeichen in XSLT 1.0 interessiert sind, erstellen Sie eine XML-Datei, die die 127 ASCII-Zeichen ihrem ASCII-Wert zuordnet und das mit Teilzeichenfolge verwendet. 'String-to-Codepoints' funktionieren jedoch mit Unicode und nicht nur mit ASCII, daher müsste Ihre Mapping-Datei ziemlich groß sein. –

+0

Welchen XSLT-Prozessor verwenden Sie und in welcher Umgebung? Die meisten haben einen Mechanismus für Erweiterungen, möglicherweise können Sie dies zu Ihrem Vorteil nutzen. – Tomalak

+1

Warum erklärst du nicht, was genau du zu erreichen versuchst und nicht, wie du denkst, dass es erreicht werden muss - siehe: http://xyproduktinfo.info/ –

Antwort

3

Es ist möglich, alle Zeichen mit Codepunkten über 255 durch "?" Verwenden von reinem XSLT 1.0 ohne Erweiterungen.

ein

<xsl:variable name="upto255">&#x9;&#xa;&#xd; !"#$%.../...ABC...abc...úûüýþÿ</xsl:variable> 

, dessen Wert eine Zeichenfolge enthält alle Zeichen im Bereich 0..255, die in XML legal sind variabel definieren.

Dann nutzen Sie die Doppel übersetzen Trick:

<xsl:variable name="above255" select="translate($input, $upto255, '')"/> 

Diese Variable ist ein String enthält alle Nicht-Latin-1-Zeichen in der Eingabezeichenfolge. Dann nutzen Sie die rekursive Template

<xsl:template name="pad"> 
    <xsl:param name="char"/> 
    <xsl:param name="count"/> 
    <xsl:choose> 
    <xsl:when test="$count=0"/> 
    <xsl:otherwise> 
     <xsl:value-of select="$char"/> 
     <xsl:call-template name="pad"> 
     <xsl:with-param name="char" select="$char"/> 
     <xsl:with-param name="count" select="$count - 1"/> 
     </xsl:call-template> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

eine Zeichenfolge der rechten Reihe von Fragezeichen zu erstellen:

<xsl:variable name="qqq"> 
    <xsl:call-template name="pad"> 
    <xsl:with-param name="char" select="'?'"/> 
    <xsl:with-param name="count" select="string-length($above255)"/> 
    </xsl:call-template> 
</xsl:variable> 

und führen Sie dann die Substitution:

<xsl:value-of select="translate($input, $above255, $qqq)"/> 

Aber natürlich, da Sie sind In Java gibt es keine Entschuldigung dafür, all diesen XSLT 1.0-Code zu schreiben, der durch eine einzige Codezeile ersetzt werden könnte, wenn Sie zu einem XSLT 2.0-Prozessor wie Saxon wechseln würden.

+0

Danke für deine Zeit. Ich habe meine Frage bearbeitet, da ich die Java-Erweiterung nicht mehr verwenden kann. Kannst du mir bitte erklären, wie es funktioniert. –

+0

Speziell Der Teil '$ above255' Wie berechnen Sie das? –

+0

Der Schlüssel meiner Antwort war unsichtbar, weil ich es nicht als Code getaggt habe. Enttäuscht, dass Sie 6 Wochen gebraucht hätten, um zu antworten. –

0

Basierend auf Ihre Kommentare möchten Sie einen String Ersatz auf einem regulären Ausdruck basiert auszuführen. Wenn Sie Java und Xalan verwenden, denke ich, dass Sie z. java:replaceAll($inputString, $regExpPattern, $replacementString) die Java-String-Methode replaceAll zu nennen, hier ist ein einfaches Beispiel

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:java="http://xml.apache.org/xalan/java" 
    version="1.0" 
    exclude-result-prefixes="java"> 

    <xsl:template match="/"> 
     <xsl:value-of select="java:replaceAll('abc-123-def','\w+', '?')"/> 
    </xsl:template> 

</xsl:stylesheet> 

die ?-?-? für mich mit Xalan ausgibt.

Auf der anderen Seite, wenn Sie Java verwenden, sollten Sie in Erwägung ziehen, zu Saxon 9 und XSLT 2.0 zu verschieben, da Sie die XPath 2.0 replace-Funktion (replace('abc-123-def', '\w+', '?')) ohne Erweiterungen verwenden können.

Ich bin nicht sicher, was das mit Ihrer ursprünglichen Frage über Zeichenfolgen-zu-Codepoints und den ASCII-Code von Zeichen zu tun hat.