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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с position и contains, Сравнение работает некорректно 
V
    Опции темы
vinograd2008
Дата 26.1.2012, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здравствуйте. Пытаюсь вывести из одного xml файла текст из дочерних узлов в другом xml файле. Вывод по позиции и contains работает некорректно всегда получаю текст первого элемента и при проверке через contains получаю текст которая переменная не содержит. 

Нужно получить текст из 1 файла дочерних элементов Termin и сравнить с точно таким же текстом дочерних элементов в другом xml файле, притом что в другом xml файле таких элементов больше.

Как изменить contains и position() в document() чтобы работало правильно чтоб выводило текст элемента Razdel из 1 файла во 2 файле только если текст элементов Termin в 1 и 2 файле совпадает, а если не совпадает то не выводило ничего?

1 файл

Код


<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="1.xsl" ?>
<Root>
<Razdel>Транспорт</Razdel>
<StatyaVRazdele>
<Termin>Самолет</Termin>
<Termin>Вертолет</Termin>
<Termin>Поезд</Termin>
<Termin>Такси</Termin>
<Termin>Автобус</Termin>
<Termin>Трамвай</Termin>
<Termin>Троллейбус</Termin>
<Termin>Автомобиль</Termin>
</StatyaVRazdele>
</Root>



2 файл

Код


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

<Statya>
    <Termin>Самолет</Termin>
  </Statya>

  <Statya>
    <Termin>Вертолет</Termin>
  </Statya>

  <Statya>
    <Termin>Поезд</Termin>
  </Statya>

  <Statya>
    <Termin>Такси</Termin>
  </Statya>

  <Statya>
    <Termin>Автобус</Termin>
  </Statya>

  <Statya>
    <Termin>Трамвай</Termin>
  </Statya>

  <Statya>
    <Termin>Троллейбус</Termin>
  </Statya>

  <Statya>
    <Termin>Автомобиль</Termin>
  </Statya>

  <Statya>
   <Termin>Корабль</Termin>
  </Statya>

  <Statya>
   <Termin>Лодка</Termin>
  </Statya>

</Root>


Стиль ко 2 файлу

Код


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
<xsl:output method="xml" indent="yes"
        doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" 
        doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
<xsl:template match="/Root"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<div>
<xsl:for-each select="Statya">
 <xsl:variable name="i" select="position()" />
           <xsl:call-template name="for">
                    <xsl:with-param name="i" />
                    <xsl:with-param name="n" />
                </xsl:call-template>
                    <xsl:value-of select="/Root/Statya[position()=$i]/Termin" />

<br/>


<xsl:variable name="refs1">
<xsl:value-of select="document('1.xml')//Termin[position() = $i]"/> // вот в этом месте пытаюсь получить текст из 1 файла по позиции
        </xsl:variable>

        <xsl:variable name="refs2">
                <xsl:value-of select="/Root/Statya[position()=$i]/Termin" />
        </xsl:variable>
        
                <xsl:variable name="refs">
            <xsl:choose>

// Здесь использую contains для проверки но получаю неправильный результат, если вместо contains пишу $refs2 = $refs1 то получаю 
только первый элемент списка razdel выводится в правильном месте, но остальные элементы переменная не содержит то есть они не передаются в переменную $refs1 хотя выводятся правильно

            <xsl:when test="contains($refs2, $refs1)"> 
                 <xsl:value-of select="document('1.xml')//Razdel"/>
            </xsl:when>
                 <xsl:otherwise>
                 </xsl:otherwise>
            </xsl:choose>
    </xsl:variable>
                Новый термин
            <xsl:value-of select="$refs"/>
</xsl:for-each>
</div>
</body>
</html>
</xsl:template> 

   <xsl:template name="for">
        <xsl:param name="i" select="position()"/>
        <xsl:param name="n" />
        <xsl:if test="$i &lt; $n">
           <xsl:call-template name="for">
                <xsl:with-param name="i" select="$i+1"/>
                <xsl:with-param name="n" select="$n"/>
           </xsl:call-template>
        </xsl:if>
    </xsl:template>
    
       <xsl:template name="fort">
        <xsl:param name="j" select="position()"/>
        <xsl:param name="n" />
        <xsl:if test="$j &lt; $n">
           <xsl:call-template name="fort">
                <xsl:with-param name="j" select="$j+1"/>
                <xsl:with-param name="n" select="$n"/>
           </xsl:call-template>
        </xsl:if>
    </xsl:template>
    
     <xsl:template name="extRow">
    <xsl:param name="src"/>
        <xsl:value-of select="document($src)//Section"/>
  </xsl:template>

</xsl:stylesheet>



Это сообщение отредактировал(а) vinograd2008 - 26.1.2012, 18:03
PM MAIL   Вверх
diadiavova
Дата 26.1.2012, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(vinograd2008 @  26.1.2012,  19:00 Найти цитируемый пост)
Нужно получить текст из 1 файла дочерних элементов Termin и сравнить с точно таким же текстом дочерних элементов в другом xml файле, притом что в другом xml файле таких элементов больше.

Получил, сравнил, а дальше-то что? Что нужно делать в зависимости от результата сравнения и что ты хочешь получить в результате всех этих действий?


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


Бывалый
*


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

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



Цитата(diadiavova @ 26.1.2012,  19:01)
Цитата(vinograd2008 @  26.1.2012,  19:00 Найти цитируемый пост)
Нужно получить текст из 1 файла дочерних элементов Termin и сравнить с точно таким же текстом дочерних элементов в другом xml файле, притом что в другом xml файле таких элементов больше.

Получил, сравнил, а дальше-то что? Что нужно делать в зависимости от результата сравнения и что ты хочешь получить в результате всех этих действий?

Вывести текст элемента Razdel для каждого элемента Termin то есть в зависимости от результата сравнения если такой то термин есть в 1 файле и совпадает с точно таким же термином в другом файле мы выводим а если не совпадает то ничего выводиться не должно или выводиться любой другой текст учитывая что позиция может быть разной в этих файлах то есть не совпадает у этих терминов
PM MAIL   Вверх
diadiavova
Дата 26.1.2012, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



vinograd2008, я так понимаю, в преобразовании обрабатывается второй файл, из него выбираются термины, а из первого файла тебе надо взять название раздела, соответствующего этому термину, если таковой в первом файле присутствует. Если так, то это будет выглядеть примерно так. Я опишу только шаблон для элемента Statya второго файла, все будет там
Код

<xsl:template match="Statya">
    <xsl:variable name="term" select="./Termin/text()" />
    <xsl:variable name="doc1_term" select="document(1.xml)//Termin[text() = $term]"/>
    <xsl:if test="$doc1_term">
        <xsl:variable name="section" select="$doc_term/../preceding-sibling::Razdel[1]/text()"/>
        <!-- Здесь формируется выходной код для термина -->
    </xsl:test>
</xsl:tamplate>


Поясняю, что я тут делаю:
1. Сначала в переменную term загружаем содержимое элемента Termin для данной статьи.
2. В переменную doc1_term загружаем элементы Termin из первого документа, содержимое которых совпадает с текстом текущей статьи
3. В элементе if проверяем, есть ли в наборе узлов doc1_term элементы и если есть( а это означает, что в первом документе найден хотя бы один узел с нужным содержимым) то выполняем формирование выходных данных. Сначала в переменную section забиваем имя раздела, соответствующее текущему термину, а дальше, имея эти данные можешь создавать любое содержимое выходного потока.

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


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

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

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

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

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


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

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


 




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


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

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