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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сквозная нумерация элементов, из существующей выборки 
V
    Опции темы
Royan
Дата 6.6.2006, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Есть документ
Код

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type='text/xsl' href='test.xslt'?>
<root>
    <parent>
        <child>AAAA</child>
        <child>BBBB</child>
        <child>CCCC</child>
        <child>DDDD</child>
    </parent>
    <parent>
        <child>EEEE</child>
        <child>FFFF</child>
        <child>GGGG</child>
    </parent>
    <parent>
        <child>HHHH</child>
        <child>IIII</child>
    </parent>    
</root>


Мне необходимо пронумеровать child ноды сквозной нумерацией, чтобы получилось в точности как здесь: http://forum.vingrad.ru/index.php?showtopi...st&p=689196
а именно

1) АААА
2) BBBB
3) CCCC
4) DDDD
5) EEEE
6) FFFF
7) GGGG
8) HHHH
9) IIII


Но моя проблема отличается тем, что я уже сделал выборку по parent и мне очень важно ее сохранить. То есть я хочу нумеровать child из выборки по /root/parent. Единственным решением в лоб, которое я вижу это внутри моего <for-eacn select="/root/parent"> делать еще один <for-eacn select="//child"> в котором child будут сравниваться по generate-id() и уже оттуда получать текущий номер child'а, но это представляется мне очень не эффективным.

Вот пример того, что придумалось мне, возможно ли сделать эффективнее?
Код


<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" encoding="UTF-8" />
    <xsl:template match="/">
        <xsl:for-each select="/root/parent">
            <xsl:for-each select="child">
                <xsl:variable name="curChild" select="."/>
                <xsl:variable name="desiredPosition"/>
                <xsl:for-each select="//child">
                    <xsl:if test="generate-id($curChild)=generate-id()">
                        <xsl:variable name="desiredPosition" select="position()"/>
                        <xsl:value-of select="position()"/>
                    </xsl:if>
                </xsl:for-each>
            <xsl:value-of select="concat($desiredPosition, ') ', ., '&#xA;')"/>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
 


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Beard
Дата 8.6.2006, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Этот пример не может работать - дважды встречается переменная desiredPosition (опечатка,
видимо), и 
Код

<xsl:if test="generate-id($curChild)=generate-id()">

  можно заменить на
Код

<xsl:if test=".=$curChild">


Сходу я бы сделал так (не факт, что лучший способ, но работать побыстрее должно, чем в Вашем примере smile):
Код

   <xsl:template match="/">
      <xsl:for-each select="/root/parent">
         <xsl:for-each select="child">
              <xsl:value-of select="concat(count(preceding::node()[name()='child'])+1, ') ', ., '&#xA;')" />
         </xsl:for-each>
      </xsl:for-each>
   </xsl:template>

Цитата(Royan @  6.6.2006,  20:14 Найти цитируемый пост)
Но моя проблема отличается тем, что я уже сделал выборку по parent и мне очень важно ее сохранить.

Вопрос - а обязательно ли ее сохранять?
Может стоит пересмотреть подход и переделать?
В чем исходная задача?    

Это сообщение отредактировал(а) Beard - 8.6.2006, 21:45
PM MAIL   Вверх
Beard
Дата 8.6.2006, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Немного улучшил свой вариант:
Код

   <xsl:template match="/">
      <xsl:for-each select="/root/parent">
        <xsl:variable name = "precedingChildCount" select = "count(preceding-sibling::node()/child)"/>    
         <xsl:for-each select="child">
             <xsl:value-of select="concat($precedingChildCount+position(), ') ', ., '&#xA;')" />
         </xsl:for-each>
      </xsl:for-each>
   </xsl:template>

Другие варианты в голову что-то не лезят 
PM MAIL   Вверх
Royan
Дата 9.6.2006, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Цитата

Этот пример не может работать - дважды встречается переменная desiredPosition (опечатка,видимо)

Нет, не опечатка все зависит от парсера (я пользуюсь Xerces 2.7.1). Если посмотреть внимательно, то переменная инициализируется единственный раз и парсер вполне в состоянии разобраться с областью видимости и инициализацией.
За пример огромное спасибо - это действительно то, что нужно!


 


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Beard
Дата 9.6.2006, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Royan @  9.6.2006,  15:59 Найти цитируемый пост)
Нет, не опечатка все зависит от парсера (я пользуюсь Xerces 2.7.1)


Я просто это увидел
Код

<?xml-stylesheet type='text/xsl' href='test.xslt'?>

и подумал, что MSXML, который с областью видимости не справляется smile

Цитата(Royan @  9.6.2006,  15:59 Найти цитируемый пост)
За пример огромное спасибо - это действительно то, что нужно!

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

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

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

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

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


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

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


 




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


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

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