Как сохранить экранированные значения символов при использовании XSLT? - PullRequest
3 голосов
/ 25 февраля 2012

Я использую XSLT для удаления ненужных атрибутов из некоторых узлов в файле. Узлы, которые не должны быть преобразованы, используют следующий простой шаблон:

<!-- Copy everything else over -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

Однако я обнаружил, что некоторые узлы теряют экранированные символы, содержащиеся в значениях их атрибутов.

Например, этот вход:

<field value="Lei Complementar No. 116/2003, Art. 6, &#167; 2&#186;, I."/>

в конечном итоге выглядит так:

<field value="Lei Complementar No. 116/2003, Art. 6, § 2º, I."/>

Как я могу предотвратить это нежелательное преобразование?

1 Ответ

3 голосов
/ 25 февраля 2012

I.Решение XSLT 1.0 :

Просто добавьте этот атрибут в xsl:output:

encoding="us-ascii"

Это приводит к тому, что любой не-ascii символ будет отображаться с его символомcode.

Однако вы все равно можете получить разные выходные данные, такие как:

<field value="Lei Complementar No. 116/2003, Art. 6, &#167; 2&#186;, I."/>

и

<field value="Lei Complementar No. 116/2003, Art. 6, &#xA7; 2&#xBA;, I." />

И, конечно, все эти три просторазличные представления одной и той же строки символов (Unicode).

II.Решение XSLT 2.0 :

Использует инструкцию <xsl:character-map> и всегда должно выдавать один и тот же вывод:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes"
   indent="yes" use-character-maps="chmEscapes"/>

 <xsl:character-map name="chmEscapes">
  <xsl:output-character character="&#167;"
                        string="&amp;#167"/>
  <xsl:output-character character="&#186;"
                        string="&amp;#186"/>
 </xsl:character-map>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к предоставленному документу XML:

<field value="Lei Complementar No. 116/2003, Art. 6, &#167; 2&#186;, I."/>

желаемый, правильный результат получается :

<field value="Lei Complementar No. 116/2003, Art. 6, &#167 2&#186, I."/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...