2011-02-03 2 views
6

У меня есть документ XML, похожий на:XSLT вывода HTML теги XML

<tag> 
    <content>adsfasdf<b>asdf</b></content> 
</tag> 

Я хотел бы для XSLT, чтобы выбрать элемент контента и показать все содержание:

<xsl:value-of select="/tag/content"/> 

XSLT настроен на рендеринг как HTML. Есть ли способ, которым я могу получить значение/копию для отображения точного содержимого без необходимости его рендеринга?

Что я ищу это

asdfasdf<b>asdf</b> 

И не:

asdfasdf ASDF

+0

Хороший вопрос, +1. Да, есть способ сделать это - см. Ответы от @ Nick-Jones и меня. :) –

ответ

10

Вам нужно бежать имена тегов в содержании, я бы рекомендовал что-то вроде:

<xsl:template match="content//*"> 
    <xsl:value-of select="concat('&lt;',name(),'&gt;')"/> 
    <xsl:apply-templates/> 
    <xsl:value-of select="concat('&lt;/',name(),'&gt;')"/> 
</xsl:template> 

, которые вы затем можете позвонить с:

<xsl:apply-templates select="/tag/content"/> 
+0

+1 для наиболее подходящего ответа. –

+0

+1 для правильного ответа. – Flack

+0

+1 Правильно: преобразование набора узлов в ** один текстовый узел **. Совет: рассмотрите случаи для пустых элементов, атрибутов и комментариев (и PI, если вы хотите сделать это) –

1

Быстрый и грязный способ:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes"/> 

    <xsl:template match="content"> 
     <xsl:copy-of select="text() | *"/> 
    </xsl:template> 
</xsl:stylesheet> 

Результат против вашего образца будет be:

adsfasdf<b>asdf</b> 

Другой подход:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes"/> 

    <xsl:template match="b"> 
     <xsl:copy> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

+1 для правильного предложения использовать 'copy-of' вместо' value-of', который имеет плакат в своем коде.Но я думаю, что для 'quick-of select =" node() "' достаточно для быстрого и грязного способа, нет необходимости отдельно указывать текст и дочерние элементы элемента с помощью text() | * '. –

+0

@Martin, я сначала написал 'node()', но потом передумал :) – Flack

+0

Я действительно сказал, что копия/значение – monksy

1

Я бы хотел е для XSLT, чтобы выбрать элемент контента и показать все содержание:

<xsl:value-of select="/tag/content"/> 

XSLT сконфигурирован для отображения в качестве HTML. Есть ли способ, которым я могу получить значение/копия для отображения точного содержимого без необходимости делать ?

Что я ищу это

asdfasdf<b>asdf</b> 

И не:

asdfasdf ASDF

Ответ @ Ник-Джонса, ближе всего к тому, что вы хотите.

ли взглянуть на таблицу стилей XSLT, которая является частью XPath Visualizer для обширного пример того, как может быть получен ИЭ стиле складной любого документа XML.

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