2014-10-21 2 views
2

Может ли кто-нибудь сказать, как я конвертирую символы с символом кода Unicode, такие как \u00e4, в реальный символ ö в XSLT?Преобразование символов с экранированием Unicode с помощью XSLT

У меня есть ...

<text>Eine Repr\u00e4sentation des Objektes geh\u00f6rt...<text> 

... и я хотел бы иметь:

<text>Eine Repräsentation des Objektes gehört...<text> 
+1

XSLT 1.0 или XSLT 2.0 (или 3.0)? –

+0

XSLT 1.0 будет отличным, но XSLT 2.0 тоже прекрасен. – Michael

+0

Сколько разных символов сбегает таким образом? У вас есть полный список, есть ли, скажем, всего 3 вхождения, всегда один и тот же персонаж? Только умлауты? –

ответ

4

Что забавная вещь, чтобы сделать ... так вот XSLT решение, что я 2,0 пришло с:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    exclude-result-prefixes="xs math f" 
    xmlns:f="func" version="2.0"> 

    <xsl:template match="text"> 
     <xsl:copy> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="text/text()"> 
     <xsl:value-of select="f:unescapeCharachters(.)"/> 
    </xsl:template> 

    <xsl:function name="f:unescapeCharachters"> 
     <xsl:param name="text" as="xs:string"/> 
     <xsl:analyze-string select="$text" regex="\\u([0-9|abcdefABCDEF]{{4}})"> 
      <xsl:matching-substring> 
       <xsl:value-of select="codepoints-to-string(f:hex-to-dec(regex-group(1)))"/> 
      </xsl:matching-substring> 
      <xsl:non-matching-substring> 
       <xsl:value-of select="."/> 
      </xsl:non-matching-substring> 
     </xsl:analyze-string> 
    </xsl:function> 

    <xsl:function name="f:hex-to-dec"> 
     <xsl:param name="hex"/> 
     <xsl:variable name="hexvals" select="'ABCDEF'"/> 
     <xsl:choose> 
      <xsl:when test="$hex=''">0</xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of 
        select="string-length(substring-before($hexvals,substring(upper-case($hex),1,1))) 
       * math:pow(16,string-length($hex)-1) + f:hex-to-dec(substring($hex,2))" 
       /> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:function> 

</xsl:stylesheet> 
+0

Приятно, хотя вы, вероятно, не хотите передавать 'text()' на вызов функции верхнего уровня, поскольку вы получите ошибку несоответствия типа, если элемент 'text' имеет более одного дочернего элемента текстового узла. Вероятно, лучше иметь шаблон, который соответствует 'text/text()' и передает '.' функции. –

+0

@IanRoberts благодарит за подсказку, ваше право ... просто не подумал об этом для примера, обновил свой ответ. –

Смежные вопросы