Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Автоматическое создание переменных и условий


Автор: vinograd2008 1.2.2012, 20:15
Есть несколько XML файлов и есть несколько иходных файлов в которых есть элементы с одинаковым содержимым все это обрабатывается одним файлом xsl. Нужно сравнивать содержимое элемента Termin в файлах 1.xml и 2.xml и с содержимым того же элемента Termin только в файлах s1, s1-1 и в зависимости от сравнения то есть если в файле 1.xml и в одном из файлов s1 или s1-1 есть одинаковые термины то получать содержимое элемента Termin и вывести его на экран то есть в браузер в html страницу если нет то ничо не выводить. Сервер не использую, весь вывод осуществляется на клиенте.

Файл 1.xml

Выглядит он следующим образом:

Код


<?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet type='text/xsl' href='1.xsl'?>
<Root>

  <Statya>
    <Termin>Сайт</Termin>
  </Statya>

  <Statya>
    <Termin>CMS</Termin>
  </Statya>

</Root>



Файл 2.xml

Код


<?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet type='text/xsl' href='1.xsl'?>
<Root>

  <Statya>
    <Termin>Интернет маркетинг</Termin>
  </Statya>

</Root>



Файл s1.xml

Код


<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="new.xsl" ?>
<Root>
<Section>Системы управления содержимым</Section>

<Ssilka name="s1" />

<TerminInSection>
<Termin>Сайт</Termin>
</TerminInSection>

<TerminInSection>
<Termin>СMS</Termin>
</TerminInSection>

</Root>



Файл s1-1.xml

Код


<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="new.xsl" ?>
<Root>
<Section>Всемирная паутина</Section>

<Ssilka name="s1-1" />

<TerminInSection>
<Termin>Интернет</Termin>
</TerminInSection>

<TerminInSection>
<Termin>Интернет маркетинг</Termin>
</TerminInSection>

</Root>



Должно в результате выводиться на экран так открываю файл 1.xml и на экране отображается.

Сайт

          Системы управления содержимым

CMS

          Системы управления содержимым

Открываю файл 2.xml на экране должно отображаться

Интернет


Интернет маркетинг

        Всемирная паутина
 
Сейчас обрабатываю я это примерно так

Код


<xsl:variable name="ref0">
<xsl:for-each select="document('s1.xml')//TerminInSection/Termin">
<xsl:value-of select="."/>
</xsl:for-each>
        </xsl:variable>
        
        <xsl:variable name="ref1">
<xsl:for-each select="document('s1-1.xml')//TerminInSection/Termin">
<xsl:value-of select="."/>
</xsl:for-each>
        </xsl:variable>

<xsl:variable name="refs2">
              <xsl:value-of select="/Root/Statya[position()=$i]/Termin" />
        </xsl:variable>
        
                <xsl:variable name="refs">
                <xsl:choose>
            <xsl:when test="contains($refs0, $refs2)">
                <xsl:value-of select="document('s1.xml')//Section"/>
            </xsl:when>
            <xsl:when test="contains($refs1, $refs2)">
                <xsl:value-of select="document('s1-1.xml')//Section"/>
            </xsl:when>
                 <xsl:otherwise>
                 </xsl:otherwise>
                                       </xsl:choose>
                </xsl:variable>

                                     <xsl:variable name="refx">
                <xsl:choose>
            <xsl:when test="contains($refs0, $refs2)">
                s1.xml
            </xsl:when>
            <xsl:when test="contains($refs1, $refs2)">
                s1-1.xml
            </xsl:when>
                 <xsl:otherwise>
                 </xsl:otherwise>
                                       </xsl:choose>
            </xsl:variable>

<a href="{$refx}">
<xsl:value-of select="$refs"/>
</a>



Это работает.

Но проблема в том что при создании нового файла s1-2 допустим приходится создавать новую переменную в xslt и писать для неё условие а также указывать имя файла в функции document а мне нужно сделать так чтобы не приходилось вносить изменения в шаблон при каждом создании нового файла чтоб не приходилось создавать новые переменные и условия для них. Как это можно сделать на xslt?

Автор: diadiavova 1.2.2012, 20:37
Если у тебя преобразование производится в браузере, а документы загружаются из файловой системы(а не с сервера), то этого сделать не получится. Используй javascript для решения своей задачи.

Автор: vinograd2008 1.2.2012, 20:42
Цитата(diadiavova @ 1.2.2012,  20:37)
Если у тебя преобразование производится в браузере, а документы загружаются из файловой системы(а не с сервера), то этого сделать не получится. Используй javascript для решения своей задачи.

И почему не получится щас же как то работает просто приходится создавать кучу переменных а я и спрашиваю как это сделать чтобы не вносить изменения в стили по сто раз. Создать универсальный xslt. А каким образом можно использовать javascript для решения такой задачи. Я просто не знаю как в javascripte использовать файловую систему а именно загружать xml документ, в C# например для этого есть метод Load, а в javascript как и выбрать из него элементы и потом это все передать в xslt в Интернете чо то ничо не могу найти по этому поводу.

Автор: diadiavova 1.2.2012, 21:45
Цитата(vinograd2008 @  1.2.2012,  21:42 Найти цитируемый пост)
И почему не получится щас же как то работает просто приходится создавать кучу переменных а я и спрашиваю как это сделать чтобы не вносить изменения в стили по сто раз. 

Что именно работает? Ты задал вопрос о том, как передать параметры в стиль, я тебе отвечаю, что из браузера никак ты этого не сделаешь. Не знаю, что у тебя сейчас работает, я тебе конкретно ответил на вопрос о том, можно ли из браузера передать параметры в преобразование.

Другой вопрос, а почему бы тебе в сами хмл файлы не вносить все данные, необходимые для их обработки? Если тебе при обработке определенного файла, нужны другие файлы, от содержимого которых зависит обработка, ну внеси сведения о них в сам документ. Выдели в нем специальную секцию, которая будет считываться преобразованием. Ведь функции document ты можешь передать и выражение xpath, которое возвратит нужный тебе адрес.

Цитата(vinograd2008 @  1.2.2012,  21:42 Найти цитируемый пост)
 просто не знаю как в javascripte использовать файловую систему

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)