Модераторы: diadiavova
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Надо сделать XSL, показывающий обрабатываемый XML, XML + XSL = HTML показывающий XML 
:(
    Опции темы
zornet
  Дата 13.8.2011, 05:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 13.8.2011

Репутация: нет
Всего: нет



Здравствуйте.

Есть задание, которое мне необходимо сделать, но я даже не знаю, с чего начать. 
Надеюсь на помощь разбирающихся в вопросе людей.

На первом этапе хотя бы задать нужное направление.

Собственно, задание:

При открытии XML-документа большинством современных веб-браузеров последние
показывают его, с возможностью открывать и скрывать части дерева XML при
нажатии на знаки<+>    и<->.

Задача.
Разработать фиксированный (один и тот же) XSL, который при трансформации
любого XML-документа дает HTML, показывающий исходный XML, и позволяющий
аналогичным образом открывать и скрывать части этого XML.
Необходимо получить представление, максимально точно совпадающее с
представлением XML интернет эксплорера (с точностью до шрифтов, цветов
раскраски и поведения при нажатии на знаки<+>    и<->).


PM MAIL   Вверх
diadiavova
Дата 13.8.2011, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Я думаю, начать надо с того, что набросать документ, который ты хочешь получить в результате. То есть, чтобы у тебя уже было представление о том, какой HTML ты хочешь получить и практически готовые CSS и javascript, а дальше уже не сложно будет(ну, если знаешь XSLT, ессно).


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
AnutaS
Дата 31.8.2011, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 31.8.2011

Репутация: нет
Всего: нет



Да спасибо вм большое за ответ конечно разобраться сложно, но можно, будем стараться!

______________________
здесь дома из бревна


Это сообщение отредактировал(а) AnutaS - 14.11.2011, 08:57
PM MAIL WWW   Вверх
magelan
Дата 26.9.2011, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 7
Всего: 16



Задачка забавная. Я XSL начинал изучать со скрипта MSIE который колорайзил код.

Я понимаю, что отвечать уже не стоит, однако на работе столкнулся с тем, что есть проблема в понимании того как происходит парсинг, поэтому расскажу несколько простых вещей:

У трансформера по умолчанию определены следующие темплейты:

Код

<xsl:template match="*|node()" priority="-1">
    <xsl:apply-templates />
</xsl:template>
<xsl:template match="text()" priority="-1">
    <xsl:value-of select="." />
</xsl:template>
<xsl:template match="comment()" priority="-1" />


Из этого становится понятно, как дальше действовать, надо переопределить основные шаблоны:
Код

<xsl:template match="*|node()">
    <xsl:text>&lt;</xsl:text> <!-- начало тега -->
    <xsl:value-of select="name()" /> <!-- имя тега -->
    <xsl:for-each select="@*"> <!-- обходим все атрибуты -->
        <xsl:text> <xsl:text> <!-- разделитель пробел -->
        <xsl:value-of select="name()" /> <!-- выводим имя, можно обрамить его в SPAN и задать класс -->
        <xsl:text>="</xsl:text>
        <xsl:value-of select="." /> <!-- выводим значение -->
        <xsl:text>"</xsl:text>
    </xsl:for-each>
    <xsl:if test="not(*|node()|text())"> <!-- Если в теге нет ничего значимого можем закрыть его сразу -->
        <xsl:text> /</xsl:text>
    </xsl:if>
    <xsl:text>&gt;</xsl:text> <!-- конец тега -->
    <xsl:if test="not(*|node()|text())"> <!-- Если в теге что-то есть, продолжаем обработку дерева -->
        <xsl:apply-templates />
        <xsl:text>&lt;/</xsl:text> <!-- рисуем закрывающий тег -->
        <xsl:value-of select="name()" />
        <xsl:text>&gt;</xsl:text>
    </xsl:if>
</xsl:template>

<xsl:template match="text()"> <!-- определяем свой обработчик текста, например, чтобы задать класс текста -->
    <DIV CLASS="text">
        <xsl:value-of select="." />
    </DIV>
</xsl:template>

<xsl:template match="comment()">
    <DIV CLASS="comment">
        <xsl:text>&lt;!-- </xsl:text> <!-- начало комментария -->
        <xsl:value-of select="." />
        <xsl:text> --&gt;</xsl:text> <!-- конец комментария -->
    </DIV>
</xsl:template>


ну и в добавление ко всему, парсинг часто нужен для поиска всяких забавных строк от контент-редакторов, можно заменять ссылки, которые построены по определенным правилам, включать в документы функциональность и прочее прочее.

Яваскрипт в пример включать не стал, чтобы не загромождать код, там все очень просто, на он клик подчиненному блоку вешается display - block/none, идентификатор подчиненного блока вычисляется как parent::*/generate-id()

Это сообщение отредактировал(а) magelan - 26.9.2011, 10:24
PM MAIL   Вверх
magelan
Дата 28.9.2011, 15:08 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 7
Всего: 16



появилось свободное время, нарисовал, вдруг кому надо.

Код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output encoding="utf-8" indent="yes" method="html" />
    
    <xsl:template match="/">
        <html>
        <head>
            <style type="text/css">
                BODY {
                    font-family: verdana, sans-serif;
                    font-size: 14px;
                }
                .symbol {
                    color: blue;
                }
                .tag {
                    color: purple;
                }
                .attribute {
                    color: brown;
                }
                .value {
                    color: black;
                }
                .quote {
                    color: brown;
                }
                .text {
                    color: black;
                    font-weight: bold;
                }
                .comment {
                    color: gray;
                    white-space:pre-wrap;
                }
                .pi {
                    color: teal;
                }
                .inner {
                    margin-left: 40px;
                }
                .ctrl {
                    color: red;
                    cursor: pointer;
                    font-family: monospace;
                }
            </style>
            <script type="text/javascript">
                var clck = function( obj, id )
                {
                    var el = document.getElementById( id );
                    var flag = el.style.display == 'none';
                    el.style.display = flag ? '' : 'none';
                    obj.innerHTML = flag ? ' - ' : ' + ';
                }
            </script>
        </head>
        <body>
            <xsl:apply-templates />
        </body>
        </html>

    </xsl:template>

    <xsl:template match="*|node()">
        <div>
            <xsl:if test="parent::*">
                <xsl:attribute name="class">inner</xsl:attribute>
            </xsl:if>
            <xsl:if test="*">
                <span onclick="clck( this, '{generate-id()}')" class="ctrl"> - </span>
            </xsl:if>
            <span class="symbol">&lt;</span>
            <span class="tag">
                <xsl:value-of select="name()" />
            </span>
            <xsl:for-each select="@*">
                <span class="attribute">
                    <xsl:text> </xsl:text>
                    <xsl:value-of select="name()" />
                </span>
                <span class="symbol">=</span>
                <span class="quote">"</span>
                <span class="value">
                    <xsl:value-of select="." />
                </span>
                <span class="quote">"</span>
            </xsl:for-each>
            <xsl:if test="not(*|node()|text())">
                <span class="symbol"> /</span>
            </xsl:if>
            <span class="symbol">&gt;</span>
            <xsl:if test="*|node()|text()">
                <span id="{generate-id()}">
                    <xsl:apply-templates />
                    <span class="symbol">&lt;</span>
                    <span class="tag">
                        <xsl:value-of select="name()" />
                    </span>
                    <span class="symbol">&gt;</span>
                </span>
            </xsl:if>
        </div>
    </xsl:template>
    <xsl:template match="text()">
        <span class="text">
            <xsl:value-of select="." />
        </span>
    </xsl:template>
    <xsl:template match="comment()">
        <div>
            <xsl:if test="parent::*">
                <xsl:attribute name="class">inner</xsl:attribute>
            </xsl:if>
            <span onclick="clck( this, '{generate-id()}')" class="ctrl"> - </span>
            <span class="symbol">&lt;!-- </span>
            <span id="{generate-id()}" class="comment">
                <xsl:value-of select="." />
            </span>
            <span class="symbol"> --&gt;</span>
        </div>
    </xsl:template>
    <xsl:template match="processing-instruction()">
        <span class="symbol">&lt;?</span>
        <span class="pi">
            <xsl:value-of select="name()" />
        </span>
        <span class="pi">
            <xsl:value-of select="." />
        </span>
        <span class="symbol">?&gt;</span>
    </xsl:template>
</xsl:stylesheet>

PM MAIL   Вверх
diadiavova
Дата 28.9.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



magelan, часто встречающиеся задачи  лучше опиши в FAQ, они тогда появятся и в раздели и в факе их проще будет найти. Ссылки на фак, статьи и новости я добавил в правила раздела.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась.

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.0469 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.