суббота, 1 ноября 2008 г.

xsl-copy без родительского тега

Не так давно, работая над XSLT-шаблонами, столкнулся с задачей вывода содержимого XML-элемента без самого тега. Дело в том, что страницы XML+XSLT у меня собираются на стороне сервера (использую ruby-xslt), а в браузер выдаётся уже сгенерированный XHTML-код. И на нестандартные теги в коде ругается HTML-Validator.

Для решения этой проблемы я нашел даже несколько способов.

XML: Исходный XML (фрагмент)


<posts>
<post id="43">
<title><a href="/blog/post/43">HTML</a></title>
<message>HyperText Markup Language — язык разметки гипертекста</message>
</post>
<post id="50">
<title><a href="/blog/post/50">XML</a></title>
<message>eXtensible Markup Language — расширяемый язык разметки</message>
</post>
<post id="51">
<title><a href="/blog/post/51">XSLT</a></title>
<message>eXtensible Stylesheet Language Transformations — часть спецификации XSL, задающая язык преобразований XML-документов</message>
</post>
</posts>


Для трансформации применяю следующие щаблоны, общие для обоих решений:

XSLT: Шаблоны для итераций


<xsl:apply-templates select="//posts" />

<xsl:template match="posts">
<xsl:apply-templates select="post" />
</xsl:template>


XSLT: Решение с помощью copy-of


<xsl:template match="post">
<div class="blog-post" id="blog-post{@id}">
<h2><xsl:copy-of select="title/*" /></h2>
<p><xsl:value-of select="message" /></p>
</div>
</xsl:template>


XSLT: Решение с помощью дополнительного шаблона


<xsl:template match="post">
<div class="blog-post" id="blog-post{@id}">
<h2><xsl:apply-templates select="title" /></h2>
<p><xsl:value-of select="message" /></p>
</div>
</xsl:template>

<xsl:template match="post/title">
<xsl:copy-of select="node()" />
</xsl:template>

0 Комментариев :

Отправить комментарий

Жги!