Ищу изящное решение для обработки "хитрого" xml
От: outsourcer Ниоткуда  
Дата: 30.11.04 11:41
Оценка:
Привет All, Великий и Ужасный!

Вопрос такой:

Есть задача отображать пользователю некие данные, которые изначально представлены в виде xml примерно такой структуры:


<?xml version="1.0" encoding="utf-8" ?> 
<roottag>
    <entry date="30.11.2004">
        Hello, World!
    </entry>
</roottag>


Естественно, что например с помощью xslt можно превратить данный xml в сколь угодно красивый html, но вот в чем загвоздка: внутри тэга entry могут храниться данные, которые сами по себе требуют некоторой обработки. Например (как на многих форумах) имеются вложенные "тэги" [link /] или [br], которые надо на ходу превращать в <a /> и <br> и тп.

Есть очевидное решение "обработать" исходный xml на сервере и превратить его сразу в html. Я пошел более извратным путем и в принципе победил проблему с помощью JavaScript + xslt, но результат не вдохновляет: для каждого тэга нужно писать неслабый кусок JavaScript-кода, в котором-таки приходится делать document.write, что ничуть не лучше "ручной" обработки xml на сервере. Да еще и к клиенту скачивается невообразимое безобразие из смеси html/xml/JavaScript, которое потом насилует его браузер.

В общем, ищу изящное решение.

P.S. Как это сделано на форуме RSDN пока "ниасилил"
P.P.S. Конкретная технология не важна, интересен подход. Т.е. вопросы типа "а на чем у тя сервак, на IIS или Apache?" не задавать!
NotYet, guys... not yet...
Re: Ищу изящное решение для обработки "хитрого" xml
От: Tourist Россия  
Дата: 30.11.04 12:39
Оценка:
Здравствуйте, outsourcer, Вы писали:

O>Привет All, Великий и Ужасный!


O>Вопрос такой:


O>Есть задача отображать пользователю некие данные, которые изначально представлены в виде xml примерно такой структуры:



O>
O><?xml version="1.0" encoding="utf-8" ?> 
O><roottag>
O>    <entry date="30.11.2004">
O>        Hello, World!
O>    </entry>
O></roottag>
O>


O>Естественно, что например с помощью xslt можно превратить данный xml в сколь угодно красивый html, но вот в чем загвоздка: внутри тэга entry могут храниться данные, которые сами по себе требуют некоторой обработки. Например (как на многих форумах) имеются вложенные "тэги" [link /] или [br], которые надо на ходу превращать в <a /> и <br> и тп.


O>Есть очевидное решение "обработать" исходный xml на сервере и превратить его сразу в html. Я пошел более извратным путем и в принципе победил проблему с помощью JavaScript + xslt, но результат не вдохновляет: для каждого тэга нужно писать неслабый кусок JavaScript-кода, в котором-таки приходится делать document.write, что ничуть не лучше "ручной" обработки xml на сервере. Да еще и к клиенту скачивается невообразимое безобразие из смеси html/xml/JavaScript, которое потом насилует его браузер.


O>В общем, ищу изящное решение.


O>P.S. Как это сделано на форуме RSDN пока "ниасилил"

O>P.P.S. Конкретная технология не важна, интересен подход. Т.е. вопросы типа "а на чем у тя сервак, на IIS или Apache?" не задавать!


Незнаю, лучшее по мне решение это при создании XML сразу обработать данное поле и получить html.

А так юзаем функции обработки строк в XSLT. Ищем все те же [br] и т.п. и заменяем их на <br/> и т.п..
Почему первый вариант для меня предпочтительный, из сооброженний производительности.
Re: Ищу изящное решение для обработки "хитрого" xml
От: Воронков Василий Россия  
Дата: 30.11.04 13:53
Оценка:
Здравствуйте, outsourcer, Вы писали:

Можно на том же джаваскрипте написать функции расширения, где пройтись по таким строкам регекспами — все будет вполне красиво и без document.write
Re: Ищу изящное решение для обработки "хитрого" xml
От: Jax Россия  
Дата: 30.11.04 14:04
Оценка:
Можно с помощью xslt, написав некоторый шаблон замены одного вхождения на другое, например:


    <xsl:template name="replace_all">

        <xsl:param name="from"/>
        <xsl:param name="to"/>
        <xsl:param name="string"/>
        
        <xsl:if test="string-length($string) > 0">
            <xsl:choose>
                <xsl:when test="substring-after($string, $from)">
                    <xsl:value-of select="substring-before($string, $from)"/>
                    <xsl:value-of select="$to"/>
                    <xsl:call-template name="replace_all">
                        <xsl:with-param name="string" select="substring-after($string, $from)"/>
                        <xsl:with-param name="from" select="$from"/>
                        <xsl:with-param name="to" select="$to"/>
                    </xsl:call-template>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="$string"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:if>

    </xsl:template>
Re[2]: Ищу изящное решение для обработки "хитрого" xml
От: outsourcer Ниоткуда  
Дата: 30.11.04 14:38
Оценка:
Здравствуйте, Jax, Вы писали:

Jax>Можно с помощью xslt, написав некоторый шаблон замены одного вхождения на другое, например:



Jax>
Jax>    <xsl:template name="replace_all">

Jax>        <xsl:param name="from"/>
Jax>        <xsl:param name="to"/>
Jax>        <xsl:param name="string"/>
        
Jax>        <xsl:if test="string-length($string) > 0">
Jax>            <xsl:choose>
Jax>                <xsl:when test="substring-after($string, $from)">
Jax>                    <xsl:value-of select="substring-before($string, $from)"/>
Jax>                    <xsl:value-of select="$to"/>
Jax>                    <xsl:call-template name="replace_all">
Jax>                        <xsl:with-param name="string" select="substring-after($string, $from)"/>
Jax>                        <xsl:with-param name="from" select="$from"/>
Jax>                        <xsl:with-param name="to" select="$to"/>
Jax>                    </xsl:call-template>
Jax>                </xsl:when>
Jax>                <xsl:otherwise>
Jax>                    <xsl:value-of select="$string"/>
Jax>                </xsl:otherwise>
Jax>            </xsl:choose>
Jax>        </xsl:if>

Jax>    </xsl:template>
Jax>


По-моему, это не прокатит, если нужно вставлять html-тэги, содержащие символ '<'. Я не прав?
NotYet, guys... not yet...
Re[2]: Ищу изящное решение для обработки "хитрого" xml
От: outsourcer Ниоткуда  
Дата: 30.11.04 14:42
Оценка:
Здравствуйте, Tourist, Вы писали:

T>Здравствуйте, outsourcer, Вы писали:


<skipped>


T>Незнаю, лучшее по мне решение это при создании XML сразу обработать данное поле и получить html.

ok.

T>А так юзаем функции обработки строк в XSLT. Ищем все те же [br] и т.п. и заменяем их на <br/> и т.п..

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

Хорошо, а как заменить "нечто", на "<br/>" (как заменить "нечто" на "что-то" я знаю)? Может я как раз тут чего-то не понимаю, но именно этот момент мне с помощью xslt и не удалось сделать — пришлось привлекать javascript. Проблема именно с символом '<'.
NotYet, guys... not yet...
Re[2]: Ищу изящное решение для обработки "хитрого" xml
От: outsourcer Ниоткуда  
Дата: 30.11.04 14:45
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, outsourcer, Вы писали:


ВВ>Можно на том же джаваскрипте написать функции расширения, где пройтись по таким строкам регекспами — все будет вполне красиво и без document.write


Годицца, пожалуй.
Правда остается проблема, что текст не должен содержать символов переноса строки (их приходится тогда сносить с помощью xslt...). Но всё равно хорошая мысль, спасибо. Послушаем другие предложения.
NotYet, guys... not yet...
Re[3]: Ищу изящное решение для обработки "хитрого" xml
От: Jax Россия  
Дата: 30.11.04 15:09
Оценка: 20 (2)
O>По-моему, это не прокатит, если нужно вставлять html-тэги, содержащие символ '<'. Я не прав?

Можно писать вот так:

XML
<?xml version="1.0" encoding="utf-8" ?> 
<roottag>
    <entry date="30.11.2004">
        Hello, World! [BR]
    Hello, World! [BR]
    </entry>
</roottag>


XSL
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2004/07/xpath-functions" xmlns:xdt="http://www.w3.org/2004/07/xpath-datatypes">
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="roottag">
        <xsl:apply-templates/>
    </xsl:template>
    
    <xsl:template match="entry">

        <xsl:call-template name="replace_all">
            <xsl:with-param name="from" select="'[BR]'"/>
            <xsl:with-param name="to" select="'BR'"/>
            <xsl:with-param name="string" select="."/>
        </xsl:call-template>
    
    </xsl:template>
    
    <xsl:template name="replace_all">

        <xsl:param name="from"/>
        <xsl:param name="to"/>
        <xsl:param name="string"/>
        
        <xsl:if test="string-length($string) > 0">
            <xsl:choose>
                <xsl:when test="substring-after($string, $from)">
                    <xsl:value-of select="substring-before($string, $from)"/>
                    <xsl:element name="{$to}"/>
                    <xsl:call-template name="replace_all">
                        <xsl:with-param name="string" select="substring-after($string, $from)"/>
                        <xsl:with-param name="from" select="$from"/>
                        <xsl:with-param name="to" select="$to"/>
                    </xsl:call-template>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="$string"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:if>

    </xsl:template>

</xsl:stylesheet>


HTML
Hello, World! <BR>
Hello, World! <BR>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.