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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> counter в xsl 
V
    Опции темы
Anime
Дата 13.9.2012, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 88
Регистрация: 13.11.2006
Где: Киев

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



xml
Код

<?xml version="1.0" encoding="windows-1251" standalone="no"?>
<XDOC>
  <HEAD messcode="2514"/>
  <BODY>
    <OTPR nom_doc="78236" unikey="7609" kod_doc="79" doc_type="7" date_op="01.06.2012 20:40:00" speed="2" srok_end="09.06.2012" vid="2" admin_otpr="1" date_otpr="01.06.2012 20:40:00">
      <TEXT name="средство перевозки грузов" name_tov="Н.Н." name_esr_otpr_real="Сл"/>
    </OTPR>
  </BODY>
</XDOC>


xsl
Код

<?xml version="1.0"  encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="windows-1251" indent="no" omit-xml-declaration="yes"/>

    
    <!-- START OTPR -->
    <xsl:template match="XDOC/BODY/OTPR">

        <xsl:text>UNB+UNOA:1+GIVCUZ::HOST+::HOST+</xsl:text>
        <xsl:value-of select="concat(substring(@date_op, 9, 2), substring(@date_op, 4, 2), substring(@date_op, 1, 2))"/>
        <xsl:text>:</xsl:text>
        <xsl:value-of select="concat(substring(@date_op, 12, 2), substring(@date_op, 15, 2))"/>
        <xsl:text>+++IN_22'&#xA;</xsl:text>
        
        
        <xsl:text>UNH+</xsl:text>
        <!--<xsl:value-of select="@Control"/>-->
        <xsl:text>+IN</xsl:text>
        <xsl:text>:D:97A:UN:OSJD'&#xA;</xsl:text>
    
    
        <xsl:text>BGM+720+</xsl:text>
        <xsl:choose>
            <xsl:when test="@nom_doc">
                <xsl:value-of select="@nom_doc"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="@nom_doc_a"/>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:text>+9'&#xA;</xsl:text>
        
        <xsl:apply-templates select="TEXT"/>

        <xsl:text>UNT+</xsl:text>
        <xsl:value-of select="counter"/>
        <xsl:text>+'&#xA;</xsl:text>
        
        
        <xsl:text>UNZ+1+'&#xA;</xsl:text>


    </xsl:template>
    <!-- END OTPR -->
    
    
    <xsl:template match="TEXT">
        <xsl:if test="@name or //OTPR/@nhm_name">
            <xsl:text>FTX+AAA+++</xsl:text>
            <xsl:choose>
                <xsl:when test="@name">
                    <xsl:value-of select="substring(@name, 1, 70)"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="substring(//OTPR/@nhm_name, 1, 70)"/>
                </xsl:otherwise>
            </xsl:choose>
            <xsl:text>'&#xA;</xsl:text>
        </xsl:if>
    </xsl:template>
    
</xsl:stylesheet>


output
Код

UNB+UNOA:1+GIVCUZ::HOST+::HOST+120601:2040+++IN_22'
UNH++IN:D:97A:UN:OSJD'
BGM+720+78236+9'
FTX+AAA+++средство перевозки грузов'
UNT++'
UNZ+1+'


Можно подсчитать сколько оно вывело элементов. Так где UNT++' должно стоять UNT+4+', так как вверху вывело 4 элемента или надо создавать какой-то предварительный xml и потом его опять через трансформер пропускать или можно все сделать в одном?
PM   Вверх
diadiavova
Дата 13.9.2012, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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


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


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 88
Регистрация: 13.11.2006
Где: Киев

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



Такой вариант.
Дан XML
Код

<?xml version="1.0" encoding="windows-1251" standalone="no"?>
<XDOC>
  <HEAD messcode="2514"/>
  <BODY>
    <OTPR nom_doc="78236" thing="one">
      <TEXT name="средство перевозки грузов"/>
    </OTPR>
  </BODY>
</XDOC>


Дан XSL
Код

<?xml version="1.0"  encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="windows-1251" indent="no" omit-xml-declaration="yes"/>
    
    <!-- START OTPR -->
    <xsl:template match="XDOC/BODY/OTPR">
        <xsl:text>HELLO MY NOM_DOC IS </xsl:text>
        <xsl:value-of select="@nom_doc"/>
        <xsl:text>&#xA;</xsl:text>
        
        
        <xsl:text>MY THING IS </xsl:text>
        <xsl:value-of select="@thing"/>
        <xsl:text>&#xA;</xsl:text>
        
        <xsl:apply-templates select="TEXT"/>
        
        <xsl:text>I HAVE COUNTER </xsl:text>
        <xsl:value-of select="counter"/> <!-- здесь должен быть какой-то счетчик -->
        <xsl:text>&#xA;</xsl:text>
    </xsl:template>
    <!-- END OTPR -->

    
    <xsl:template match="TEXT">
        <xsl:if test="@name">
            <xsl:text>AND I HAVE </xsl:text>
            <xsl:value-of select="substring(@name, 1, 70)"/>
            <xsl:text>&#xA;</xsl:text>
        </xsl:if>
    </xsl:template>
    
</xsl:stylesheet>


и вывод будет таким
Код

HELLO MY NOM_DOC IS 78236
MY THING IS one
AND I HAVE средство перевозки грузов
I HAVE COUNTER ...


Раньше это было организовано двумя файлами XSLT
В первом файле формировался предварительный XML с тэгами (назавем эти тэги segment), а во втором уже был вывод, то есть было написано прохождение по сегментам, а в конце был подсчет сегментов
Код

<xsl:text>I HAVE COUNTER </xsl:text>
<xsl:value-of select="counter(segment)"/>
<xsl:text>&#xA;</xsl:text>


Вот я и думаю можно ли это сделать в одном  файле XSLT?
Вот как можно сделать чтоб "I HAVE COUNTER ..." выдавал количество строк (то есть "I HAVE COUNTER 3", так как "HELLO MY NOM_DOC IS 78236" это 1 строка , "MY THING IS one" это вторая строка и так далее)?

Это сообщение отредактировал(а) Anime - 14.9.2012, 11:40
PM   Вверх
diadiavova
Дата 15.9.2012, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Anime, счетчик в хслт реализовать можно, но геморно и это чаще всего плохое решение. В твоем случае надо составить выражение XPath, которое будет возвращать все элементы, выводящие строку в выходной документ и подсчитать количество таких элементов с помощью функции count. Ну что-то вроде такого.
Код

<xsl:value-of select="count(//OPTR/@*|//TEXT/@name)" />
В данном случае выражение должно будет подсчитывать количество атрибутов всех элементов OPTR и атребутов name элементов TEXT (насколько я понял в твоем примере именно они формируют строки)


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


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 88
Регистрация: 13.11.2006
Где: Киев

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



Атрибуты в теги формируют строки.
Но дело ещё в том что мне не все атрибуты в теге нужны. Можно как-то задать массив или указать явно на атрибуты которые надо считать?
PM   Вверх
diadiavova
Дата 19.9.2012, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Anime @ 19.9.2012,  11:44)
Атрибуты в теги формируют строки.
Но дело ещё в том что мне не все атрибуты в теге нужны. Можно как-то задать массив или указать явно на атрибуты которые надо считать?

Явно указать можно. Я специально привел такой пример, чтоб показать разные возможности. Если есть признак, по которому определяется, нужен ли атрибут, то можно сформулировать его в фильтре. Если нет такого признака - всегда дожно перечислить нужные атрибуты. Тут принцип прост:  надо написать такое выражение, которое возвратит все узлы, формирующие строки, и передать его функции каунт.


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

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

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

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

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


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

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


 




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


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

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