2015-05-04 4 views
2

В настоящее время я работаю над преобразованием XSLT, чтобы изменить структуру некоторых XML-документов в структуру, которая необходима внешнему поставщику услуг.Обработка HTML-объектов в элементе CDATA

Мой исходный документ содержит очень большой элемент с содержанием CDATA, как это:

<ABC> 
     <![CDATA[ 
     Lorem ipsum dolor sit amet<br><br> 
     onsetetur sadipscing elitr, sed diam nonumy eirmod tempor<br> 
     At vero eos et &auml;ccusam et justo duo dolores et ea rebum 
     ..."LARGE CONTENT"... 
     ]]> 
</ABC> 

Обратите внимание, что текст содержит незакрытые <BR> элементов и множество различных HTML сущностей, как & AUML;

Желаемый результат в моем целевом документе должен выглядеть следующим образом:

<p> 
     Lorem ipsum dolor sit amet<br/><br/> 
     onsetetur sadipscing elitr, sed diam nonumy eirmod tempor<br/> 
     At vero eos et äccusam et justo duo dolores et ea rebum 
     ...&quot;LARGE CONTENT&quot;... 
</p> 

Нет CDATA, в < бр > элементы были закрыты, так что я хорошо сформирован XML и HTML сущности были преобразованы в UTF символы, как в примере: & auml; -> ä
За исключением лиц, которые вы должны бежать на XML, как <,>, ",", &

Мой путь обработать это:

<xsl:template match="ABC"> 

    <xsl:variable name="temp" select="replace(text(),'&amp;auml;','ä')"/> 

    <!--[... many replacement rules for HTML entities...]--> 

    <xsl:value-of select="replace($temp,'&lt;br&gt;','&lt;br/&gt;')" disable-output-escaping="yes"/> 

</xsl:template> 

Этот шаблон выполняет свои требования , но есть много правил замены, и это, кажется, очень обстоятельные и неэффективные.

есть ли лучший способ обработать эту неэкранированный из HTML сущностей?

+1

Какой XSLT-процессор вы используете? 'replace' предполагает, что это процессор XSLT 2.0, а коммерческие версии Saxon 9 (PE, EE) имеют функцию расширения' parse-html' http://www.saxonica.com/documentation/index.html#!functions/ saxon/parse-html, который должен выполнить задание (ну, он анализирует HTML-документ, поэтому вам может понадобиться использовать 'saxon: parse-html (concat ('< html>',., '& lt/html>'))'). –

+0

Привет, Мартин. Я использую Oxygen XML IDE. Поэтому я предполагаю, что могу использовать Saxon 9 (PE, EE). Я попробую! Спасибо! – mailivres

+0

saxon: parse-html() многое помогло! Должен ли я добавить это как ответ на этот вопрос? – mailivres

ответ

1

Если вы ш ant для анализа фрагмента HTML или HTML-документа, и вы используете коммерческую версию Saxon 9 (PE или EE), тогда она предоставляет поддержку синтаксического разбора HTML с помощью TagSoup, отображаемого как функция расширения saxon:parse-html (в пространстве имен http://saxon.sf.net/, см. http://www.saxonica.com/documentation/index.html#!functions/saxon/parse-html), которые можно было бы назвать в

<xsl:template match="ABC"> 
    <p> 
    <xsl:apply-templates select="saxon:parse-html(.)/node()"/> 
    </p> 
</xsl:template> 

или подобной обработки узлов, созданных TagSoupHTML анализатором.

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