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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как проверить атрибут следующей записи 
:(
    Опции темы
Millisa
Дата 19.1.2010, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте
 у меня есть xml
Код

<data jsxid="jsxroot">
    <record jsxid="12" jsxTitle="active" jsxPId="13" />
    <record jsxid="115" jsxTitle="beginDate" jsxPId="13"/>
    <record jsxid="162" jsxTitle="WebServices" jsxPId="161"/>
</data>

в xsl коде для применения template я использую проверку:
Код

<xsl:if test="following-sibling::record[1]/@jsxPId=current()/@jsxPId" >
    <xsl:apply-templates mode="child" select="following-sibling::record"/>
    </xsl:apply-templates>
</xsl:if>

почему-то при 
following-sibling::record[1]/@jsxPId=13
current()/@jsxPId=161

все равно мы входим в if . Что я делаю неправильно?? Мне в этом месте нужно зайти в этот xsl только если jsxPId следующего record равен текущему,  в чем может быть ошибка, или это можно реализовать как-то по другому?? Помогите пожалуйста!

Это сообщение отредактировал(а) Millisa - 19.1.2010, 13:58
PM MAIL   Вверх
diadiavova
Дата 19.1.2010, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

И пользуйся разметкой


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


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


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

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



Код

<?xml version="1.0" encoding="utf-8" ?>
<data jsxid="jsxroot">
    <record jsxid="12" jsxTitle="active" jsxPId="13" />
    <record jsxid="115" jsxTitle="beginDate" jsxPId="13"/>
    <record jsxid="162" jsxTitle="WebServices" jsxPId="161"/>
</data>
Код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
 >
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="record">
        <xsl:if test="following-sibling::record[1]/@jsxPId=current()/@jsxPId" >
            <v><xsl:value-of select="@jsxid"/>
        </v>
        </xsl:if>
    </xsl:template>
    <xsl:template match="/">
        <result> 
        <xsl:apply-templates/>
        </result>
    </xsl:template>
</xsl:stylesheet>


И всё это даёт такой вот вывод
Код

<?xml version="1.0" encoding="utf-8"?>
<result>
    <v>12</v>
    
    
</result>
Как видишь отобразился только первый элемент.


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


Новичок



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

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



Теперь я еще меньше понимаю
Вот мой весь xsl
Код

<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="/">
        <data jsxid="jsxroot">
            <xsl:apply-templates mode="parent" select="*/record">
            </xsl:apply-templates>
        </data>
    </xsl:template>
    
    <xsl:template mode="parent" match="record">
        <xsl:if test="not(@jsxPId=preceding-sibling::record/@jsxPId)">
            <xsl:element name="record">
                <xsl:attribute name="jsxid">
                    <xsl:value-of select="@jsxPId"/>
                </xsl:attribute>
                <xsl:attribute name="jsxPId">
                    <xsl:value-of select="0"/>
                </xsl:attribute>
                <xsl:apply-templates mode="child" select="current()"/>
            </xsl:element>
            <xsl:if test="position()!=last()">
            <xsl:apply-templates mode="parent" select="following-sibling::record"/>
            </xsl:if>
        </xsl:if>
        
    </xsl:template>
    <xsl:template mode="child" match="record">
        <xsl:element name="record">
            <xsl:attribute name="jsxid">
                <xsl:value-of select="@jsxid"/>
            </xsl:attribute>
            <xsl:attribute name="jsxPId">
                <xsl:value-of select="@jsxPId"/>
            </xsl:attribute>
        </xsl:element>
        <xsl:if test="following-sibling::record[1]/@jsxPId=current()/@jsxPId" >
            <v><xsl:value-of select="@jsxid"/>
        </v>
        </xsl:if>
        <xsl:if test="following-sibling::record[1]/@jsxPId=current()/@jsxPId" >
            <xsl:apply-templates mode="child" select="following-sibling::record">
            </xsl:apply-templates>
        </xsl:if>
</xsl:template>
</xsl:stylesheet>



и если применить его к xml то на выходе
Код

- <data jsxid="jsxroot">
- <record jsxid="13" jsxPId="0">
  <record jsxid="12" jsxPId="13" /> 
  <v>12</v> 
  <record jsxid="115" jsxPId="13" /> 
  <record jsxid="162" jsxPId="161" /> 
  </record>
- <record jsxid="161" jsxPId="0">
  <record jsxid="162" jsxPId="161" /> 
  </record>
- <record jsxid="161" jsxPId="0">
  <record jsxid="162" jsxPId="161" /> 
  </record>
  </data>


Т.е. получается если внутри if лежит variable, то условие срабатывает правильно. в моем же случае - неправильно (

Мне на выходе нужно получить вот такой - 
         
Код

<data jsxid="jsxroot">
- <record jsxid="13" jsxPId="0">
        <record jsxid="12" jsxPId="13" /> 
        <record jsxid="115" jsxPId="13" /> 
  </record>
- <record jsxid="161" jsxPId="0">
<record jsxid="162" jsxPId="161" /> 
  </record>
  </data>


Это сообщение отредактировал(а) Millisa - 19.1.2010, 14:06
PM MAIL   Вверх
diadiavova
Дата 19.1.2010, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Millisa, а исходный документ где? И что нужно получить в результате?

Добавлено через 48 секунд
Да и ещё...вторая строчка стиля что делает?


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


Новичок



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

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



входной xml такой 
Код

<data jsxid="jsxroot">
    <record jsxid="12" jsxTitle="active" jsxPId="13" />
    <record jsxid="115" jsxTitle="beginDate" jsxPId="13"/>
    <record jsxid="162" jsxTitle="WebServices" jsxPId="161"/>
</data>


выходной должен быть такой
Код

<data jsxid="jsxroot">
- <record jsxid="13" jsxPId="0">
        <record jsxid="12" jsxPId="13" /> 
        <record jsxid="115" jsxPId="13" /> 
  </record>
- <record jsxid="161" jsxPId="0">
<record jsxid="162" jsxPId="161" /> 
  </record>
  </data>

мне нужно проходя по входному xml смотреть если  jsxPId изменился, то создать parent с id=jsxPId и этот рекорд будет его child, а если не изменился, тогда это child того же parent что уже был ранее создан. 
Все рекорды, относящиеся к одому паренту идут подряд, поэтому я иду по xml и проверяю у следующего рекорда jsxPId такой же или он изменился, если изменился выхожу из template child и создаю нового parent, если не изменился, снова вызываю template child

Добавлено @ 14:05
Если сделать так
Код

<xsl:if test="following-sibling::record[1]/@jsxPId=current()/@jsxPId" >
        <v><xsl:value-of select="@jsxPId"/> </v>
        <xsl:apply-templates mode="child" select="following-sibling::record"/>
</xsl:if>


То если судить по выводу <xsl:value-of select="@jsxPId"/> в if он заходит правильно, но почему-то <xsl:apply-templates ....> выполняет не смотря на то что он находится в if

PS. Вторая случайно скопировалась, уже убрала

Это сообщение отредактировал(а) Millisa - 19.1.2010, 14:07
PM MAIL   Вверх
diadiavova
Дата 19.1.2010, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

Это сообщение отредактировал(а) diadiavova - 19.1.2010, 14:29


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


Новичок



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

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



В одну группу попадают только те что идут подряд с одинаковым jsxPId
PM MAIL   Вверх
diadiavova
Дата 19.1.2010, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Millisa @  19.1.2010,  15:29 Найти цитируемый пост)
В одну группу попадают только те что идут подряд с одинаковым jsxPId 

Тогда всё упрощается
Код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="/">
        <data jsxid="jsxroot">
            <xsl:call-template name="parids"/>
        </data>
    </xsl:template>
    <xsl:template name="group">
        <xsl:param name="parid"/>
        <record jsxid="{$parid}" jsxPId="0">
            <xsl:copy-of select="//record[@jsxPId=$parid]"/>
        </record>
    </xsl:template>
    <xsl:template name="parids">
        <xsl:for-each select="*//record">
            <xsl:if test="not(preceding-sibling::record[last()]/@jsxPId = @jsxPId)">
                <xsl:call-template name="group">
                <xsl:with-param name="parid" select="@jsxPId"/>
            </xsl:call-template>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
Так вроде работает


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


Бывалый
*


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

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



Я правильно понял:
Код

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="data">
    <data jsxid="jsxroot">
        <xsl:apply-templates mode="parent" select="record"/>
    </data>
</xsl:template>
    
<xsl:template mode="parent" match="record">
    <xsl:if test="not(@jsxPId=preceding-sibling::record/@jsxPId)">
        <record jsxid="{@jsxPId}" jsxPId="0">
            <record jsxid="{@jsxPId}" jsxPId="{@jsxPId}"/>
            <xsl:apply-templates mode="child" select="following-sibling::record[@jsxPId = current()/@jsxPId]"/>
        </record>
    </xsl:if>
</xsl:template>

<xsl:template mode="child" match="record">
        <record jsxid="{@jsxid}" jsxPId="{@jsxPId}"/>
</xsl:template>
</xsl:stylesheet>

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


Новичок



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

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



Спасибо огромное!!!!!!
Вариант  JVM  smile работает идеально! 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

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

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

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

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


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

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


 




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


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

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