Замена и поддержка символьных сущностей с помощью нескольких преобразований - PullRequest
2 голосов
/ 13 ноября 2010

Проблема: у нас есть символьные объекты, поступающие в наши системы в различных форматах (например: & и &), и нам необходимо преобразовать их в стандартные символьные объекты XML, если необходимо (&amp < > ' "), а затем поддерживать их как сущности через пару отдельных преобразований.

Данный XML из:

<rootelm>
 <testdata>&amp;apos; &amp;gt; &amp;lt; &amp;quot;</testdata>
</rootelm>

и таблица стилей (на основе xsl: таблица символов для замены специальных символов ):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
 <!-- COPY EVERYTHING -->
 <xsl:template match="node() | @*">
  <xsl:copy>
   <xsl:apply-templates select="@* | node()">
    <xsl:sort select="local-name()"/>
   </xsl:apply-templates>
  </xsl:copy>
 </xsl:template>
 <xsl:variable name="quote">
  <xsl:text>&amp;quot;</xsl:text>
 </xsl:variable>
 <xsl:variable name="quote2">
  <xsl:value-of select="string('&quot;')"/>
 </xsl:variable>
 <xsl:template match="text()[contains(.,'&amp;lt;') or contains(.,'&amp;gt;') or contains(.,'&amp;quot;') or contains(.,'&amp;apos;')]">
  <xsl:value-of select='replace(
  replace(
   replace(
    replace(., "&amp;lt;", "&lt;"),
   "&amp;gt;",
   "&gt;"
   ),
  "&amp;apos;",
  "&apos;"
  ),
  $quote,
  $quote2
 )
    ' />
 </xsl:template>
</xsl:stylesheet>

Как сохранить апострофы и цитаты как сущности (исходная система ожидает / нуждается в них)?

Токовый выход:

<rootelm> 
   <testdata>' &gt; &lt; "</testdata>
</rootelm>

1 Ответ

3 голосов
/ 13 ноября 2010

Использование Символьные карты :

[Определение: карта символов позволяет конкретный символ, появляющийся в тексте или атрибут узла в конечном результате дерево, которое будет заменено указанным строка символов во время сериализации.]

<xsl:character-map name="quotes">
  <xsl:output-character character='"' string="&amp;quot;"/>   
  <xsl:output-character character="'" string="&amp;apos;"/>
</xsl:character-map>
...