нужно отобразить char в xslt - PullRequest
       0

нужно отобразить char в xslt

1 голос
/ 09 февраля 2011

Привет всем Я использую xslt 1.0. У меня есть код символа FOA7, который должен отображаться как соответствующий символ. Мой ввод

<w:sym w:font="Wingdings" w:char="F0A7"/>

мой шаблон xslt

<xsl:template match="w:sym">
    <xsl:variable name="char" select="@w:char"/>
    <span font-family="{@w:fonts}">        
    <xsl:value-of select="concat('&#x',$char,';')"/>
    </span>
</xsl:template>

Показывает ошибку как ОШИБКА: 'A decimal representation must immediately follow the "&#" in a character reference.'

Пожалуйста, помогите мне исправить это .. Спасибо заранее ...

Ответы [ 4 ]

2 голосов
/ 09 февраля 2011

Это невозможно в (разумном) XSLT.Вы можете обойти это.

  • Ваше решение с concat недопустимо: XSLT - это не просто причудливый конкатенатор строк, он действительно преобразует концептуальное дерево .Закодированный символ, такой как &#xf0a7;, представляет собой один символ - если бы вы каким-то образом включили буквы & # x f 0 a 7 ;, тогда процессор XSLTвключить эти буквы в XML data , а не в строку!Таким образом, это означает, что он избежит их.
  • В XSLT 1.0 нет функции, которая позволяла бы преобразовывать число в символ с этой кодовой точкой.
  • В XSLT 2.0, как указывает Майкл Кей, выможно использовать codepoints-to-string() для достижения этой цели.

Существует два решения.Во-первых, вы можете использовать disable-output-escaping.Это довольно неприятно и не переносимо .Избегайте этого любой ценой, если можете - но, вероятно, он будет работать в вашем трансформаторе, и это, вероятно, единственное общее простое решение, поэтому вы, возможно, не сможете этого избежать.

Вторым решением будетЖесткий код соответствует для каждого отдельного символа.Обычно это беспорядок, но вполне возможно, если вы имеете дело с ограниченным набором возможностей - это зависит от вашей конкретной проблемы.

Наконец, я бы порекомендовал не решить эту проблему вXSLT - это обычно то, что вы можете сделать в предварительной / последующей обработке в другой среде программирования более подходящим образом.Скорее всего, у вас есть представление XML-документа в памяти, чтобы вы могли использовать XSLT, в этом случае это даже не займет много процессорного времени.

2 голосов
/ 09 февраля 2011
<span font-family="{@w:font}">
    <xsl:value-of select="concat('&amp;#x', @w:char, ';')" 
        disable-output-escaping="yes"/>
</span>

Хотя посмотрите ответ @ Имон Нербонн, почему вы вообще не должны этого делать.

1 голос
/ 09 февраля 2011

Если вы использовали XSLT 2.0 (которым вы не являетесь), вы могли бы написать функцию для преобразования шестнадцатеричного значения в десятичное и затем использовать codepoints-to-string () для результата.

0 голосов
/ 09 февраля 2011

используйте '&' для '&' в выводе:

<xsl:value-of select="concat('&amp;#x',$char,';')"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...