2016-08-05 1 views
0

Мне нужно получить значение символа ASCII и преобразовать код ASCII обратно в символ, если он удовлетворяет определенным условиям.string-to-codepoints (string) эквивалент в XSLT 1.0

Таким образом, я наткнулся на эти функции:

string-to-codepoints(string)

и

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

предусмотрено в XSLT 2.0 (или, скорее XPATH 2.0) Но, к сожалению, мне нужно использовать XSLT 1.0 для этого задача.

Так что мой вопрос

Есть ли эквивалент этих функций в XSLT 1.0? Если нет, можем ли мы его спроектировать? Могут ли эксперты помочь мне в этом?

Заранее спасибо

+0

Ну, есть только несколько символов ASCII, поэтому, если вас действительно интересуют только символы ASCII в XSLT 1.0, тогда создайте XML-файл, который отображает 127 символов ASCII в их значение ASCII и использует их с подстрокой. 'string-to-codepoints' однако работает с Unicode, а не только с ASCII, поэтому ваш файл сопоставления должен быть довольно большим. –

+0

Какой процессор XSLT вы используете и в какой среде? У большинства есть механизм для расширений, возможно, вы можете использовать это в своих интересах. – Tomalak

+1

Почему бы вам не объяснить, что именно вы пытаетесь выполнить, а не как вы думаете, что это нужно сделать - см .: http://xyproblem.info/ –

ответ

3

Возможно заменить все символы кодовыми точками выше 255 на "?" используя чистый XSLT 1.0 без расширений.

Определить переменную

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

, значение которого является строка, содержащая все символы в диапазоне 0..255, которые разрешены в XML.

Затем с помощью двойного перевода трюк:

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

Эта переменная представляет собой строку, содержащую все не-Latin-1 символов, присутствующих в строке ввода. Затем используйте рекурсивный шаблон

<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> 

создать строку из правого ряда вопросительных знаков:

<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> 

, а затем сделать замену:

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

Но, конечно, так как вы в Java нет оправдания для написания всего этого кода XSLT 1.0, который можно заменить одной строкой кода, если вы перешли на XSLT 2.0-процессор, такой как Saxon.

+0

Спасибо за ваше время. Я отредактировал свой вопрос, поскольку больше не могу использовать расширение Java. Не могли бы вы объяснить, как это работает. –

+0

Специально Часть '$ above255', как вы рассчитываете, что –

+0

Ключевая часть моего ответа была невидимой, потому что я не смог пометить ее как код. Разочаровался, что он должен был взять вас на 6 недель, чтобы ответить. –

0

На основании ваших комментариев вы хотите, чтобы выполнить замену строки на основе регулярного выражения. Если вы используете Java и Xalan, то я думаю, что вы можете использовать, например. java:replaceAll($inputString, $regExpPattern, $replacementString) для вызова метода Java String, replaceAll, вот простой пример

<?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> 

, который выводит ?-?-? для меня с Xalan.

С другой стороны, если вы используете Java, то вам следует рассмотреть возможность перехода на Saxon 9 и XSLT 2.0 таким образом, что вы можете использовать функцию XPath 2.0 replace (replace('abc-123-def', '\w+', '?')) без каких-либо дополнительных расширений.

Я не уверен, что это имеет отношение к вашему первоначальному вопросу о привязке строк к кодовым точкам и кодовых символах ASCII.