С помощью XSLT в свою очередь, содержание предпросмотром хранимых в xml в HTML


В CMS я использую использует процессор отключено преобразование XSLT, который является процессором XSLT версии 1.0. Редакторы, которые используют визуальный полей в CMS может сохранить контент, который будет выглядеть как:

<story>
    <p>Story Text which may have <em>formatting</em>.</p>
</story>

или:

<story>Story Text which may have <em>formatting</em>.</story>

или даже:

<story>
    <div>Story Text which may<br /> have <em>formatting</em>.</div>
</story>

Для того, чтобы обрабатывать эти различные случаи, я использую:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/> 
<xsl:template match="/system-index-block">
    <xsl:for-each select="story">
        <xsl:choose>
            <!-- If wrapped in an element -->
            <xsl:when test="./p|./div">
                <!-- copy what is inside story, allow for text outside of elements -->
                <xsl:copy-of select="./text()|./*"/>
            </xsl:when>
            <!-- wrap the content in a paragraph tag -->
            <xsl:otherwise>
                <p>
                    <!-- copy text and tags from inside story -->
                    <xsl:copy-of select="./text()|./*"/>
                </p>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Есть ли лучший способ хорошо производить сформированные HTML из этих данных? Есть ли способ, чтобы просто это?



1150
6
задан 10 февраля 2011 в 11:02 Источник Поделиться
Комментарии
1 ответ

Вы должны изменить свое мышление при работе с XSLT: смотреть на него как на функциональном языке, где вы объявляете правила преобразования элементов. Подумайте об этом в терминах событий: когда элемент P будет найден на вход, я ожидал и что на выходе.

Во-первых, что касается определения ваших данных. Вы должны попросить (или создать) более формальное описание данных. Существуют различные форматы для описания структуры (грамматика), определение DTD и XML-схемы является более распространенным. Есть более простые альтернативы, такие как отдых НГ и в schematron.

Я думаю, от стиля и вашего описания:


  • всегда есть в верхней

  • есть список элементы

  • есть смешанное содержимое HTML в с ,
    ,, и текст допускается

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

<story>
Text before a <p>Paragraph</p> in between or <div>Div</div> even after ?
</story>

Вы должны разбить свой уникальный шаблон правила на несколько правил шаблона, один или несколько для каждого элемента. Затем, чтобы направить поток от правила к правилу, не используется для-каждого а применять-шаблоны:

<xsl:template match="system-index-block">
<!-- Note:
You probably need to create the basic HTML structure Here: html, head, body
-->
<xsl:apply-templates /> <!-- you can specify select="story" but it is not required -->
</xsl:template>

<xsl:template match="story[p|div]"> <!-- If wrapped in an element -->
<xsl:apply-templates mode="copy" />
</xsl:template>

<xsl:template match="story"> <!-- wrap the content in a paragraph tag -->
<p>
<xsl:apply-templates mode="copy" />
</p>
</xsl:template>

Обратите внимание, что я использовал режим "копировать" выше: теперь вы можете создавать различные правила для той же узлов, в зависимости от режима, например:

<xsl:template match="text()" /> <!-- ignore text in normal mode, probably whitespace -->

<xsl:template match="text()" mode="copy">
<xsl:copy />
</xsl:template>

Кроме того, вы, вероятно, попасть в беду, потому что вы только объявить пространство имен для работы с xsl префикс. Обычно требуется префикс/объявление пространства имен для входных и выходных форматов. Затем вы должны использовать префикс в матче/выбирайте выражения и имена тегов для вывода, например, с входной префикс привязанный к вашей входной имен и HTML привязаны к HTML-пространство имен:

<xsl:template match="input:story"> <!-- wrap the content in a paragraph tag -->
<html:p>
<xsl:apply-templates mode="copy" />
</html:p>
</xsl:template>

Чтобы идти дальше, вот несколько советов, которые вы, вероятно, найдете полезным:

5
ответ дан 12 февраля 2011 в 07:02 Источник Поделиться