2010-11-12 2 views
2

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

Учитывая XML из:

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

и таблица стилей из (на основе xsl:character-map to replace special characters):

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

ответ

3

Использование Character Maps:

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

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

Спасибо, что сделал. – johkar

+0

@johkar: Ты добрый. – 2010-11-16 14:09:11