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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как это сделать? Помогите правильно сделать... 
:(
    Опции темы
t77
  Дата 30.3.2010, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Доброе время суток.
Чтобы не рассказывать здесь много всего лишнего, опишу конкретно проблемку...
Имеется хмл файл, следующей структуры:
Код

<QUERY>
     <ITEMS>
         <ITEM>
             <CONTAINER>
                 <RECORD id="1" order="1">
                     <INPUT>input_text1</INPUT>
                     <TEXTAREA>
                         <![CDATA[textarea_text1]]>
                     </TEXTAREA>
                     <EDITOR_FIELD>
                         <![CDATA[ editor_text1]]>
                     </EDITOR_FIELD>
                 </RECORD>
                 <RECORD id="2" order="2">
                     <EDITOR_FIELD>
                         <![CDATA[ editor_text2]]>
                     </EDITOR_FIELD>
                     <TEXTAREA>
                         <![CDATA[ textarea_text2]]>
                     </TEXTAREA>
                     <INPUT>input_text2</INPUT>
                 </RECORD>
                 <RECORD id="3" order="3">
                     <EDITOR_FIELD>
                         <![CDATA[ editor_text3]]>
                    </EDITOR_FIELD>
                     <TEXTAREA>
                         <![CDATA[ textarea_text3]]>
                    </TEXTAREA>
                    <INPUT>input_text3</INPUT>
                </RECORD>                                 
                 <RECORD id="4" order="4">
                     <INPUT>input_text4</INPUT>
                     <EDITOR_FIELD>
                         <![CDATA[ editor_text4]]>
                    </EDITOR_FIELD>
                     <TEXTAREA>
                         <![CDATA[ textarea_text4]]>
                    </TEXTAREA>
                </RECORD>
                 <RECORD id="5" order="5">
                     <INPUT>input_text5</INPUT>
                     <EDITOR_FIELD>
                         <![CDATA[ editor_text5]]>
                     </EDITOR_FIELD>
                     <TEXTAREA>
                         <![CDATA[ textarea_text5]]>
                     </TEXTAREA>
                 </RECORD>
                 <RECORD id="6" order="6">
                     <INPUT>input_text6</INPUT>
                     <EDITOR_FIELD>
                         <![CDATA[ editor_text6]]>
                     </EDITOR_FIELD>
                     <TEXTAREA>
                         <![CDATA[ textarea_text6]]>
                     </TEXTAREA>
                 </RECORD>                                                                
            </CONTAINER>            
        </ITEM>
    </ITEMS>    
</QUERY>

Мне необходимо считывать данные из тега INPUT и записывать их ввиде одного столбика. После каждого значения нужно нарисовать линию(HR), чтобы было разделение между выводимыми данными.
Например из вышеприведенного хмл файла, результат должен быть следующим:
Код

input_text1
--------------
input_text2
--------------
input_text3
--------------
input_text4
--------------
input_text5
--------------
input_text6

Очень важно не рисовать линию перед первым выводимым значением и после последнего виводимого значения !

Задача, на первый взгляд кажется тривиальной... 

Вот так вот выглядит мой шаблон:
Код

<xsl:template name="getFieldValueFromContainer">
        <xsl:param name="containerName"/>
        <xsl:param name="elementName"/>
        <xsl:param name="urlLoc" />

        <xsl:variable name="xmlDoc" select="document(java:CMUrl.addSessionId(string($urlLoc),string($jsessionid)))/QUERY/ITEMS/ITEM/*[name()=$containerName]/RECORD" />
        
        <xsl:if test="$xmlDoc">
            <xsl:for-each select="$xmlDoc">
                <xsl:sort select="child::*[name()=$elementName]" order="ascending" />

                <xsl:variable name="rowNumber">
                    <xsl:value-of select="@order"/>
                </xsl:variable>
                
                <xsl:variable name="elemValue">
                    <xsl:value-of select="normalize-space(child::*[name()=$elementName])"/>
                </xsl:variable>
                
                <xsl:if test="$elemValue != ''">                    
                    <!--draw line always except the first cell-->
                    <xsl:if test="number($rowNumber) &gt; 1">             
                        <hr style="border-bottom: 1px solid #c9d1dc;"/>
                    </xsl:if>
                    <xsl:value-of select="$elemValue"/>                    
                </xsl:if>
            </xsl:for-each>
        </xsl:if>                
    </xsl:template>


Теперь предположим что у нас немного другие данные в файле хмл:
Код

<QUERY>
     <ITEMS>
         <ITEM>
             <CONTAINER>
                 <RECORD id="1" order="1">
                     <INPUT/>
                     <TEXTAREA>
                         <![CDATA[textarea_text1]]>
                     </TEXTAREA>
                     <EDITOR_FIELD>
                         <![CDATA[ editor_text1]]>
                     </EDITOR_FIELD>
                 </RECORD>
                 <RECORD id="2" order="2">
                     <EDITOR_FIELD>
                         <![CDATA[ editor_text2]]>
                     </EDITOR_FIELD>
                     <TEXTAREA>
                         <![CDATA[ textarea_text2]]>
                     </TEXTAREA>
                     <INPUT/>
                 </RECORD>
                 <RECORD id="3" order="3">
                     <EDITOR_FIELD>
                         <![CDATA[ editor_text3]]>
                    </EDITOR_FIELD>
                     <TEXTAREA>
                         <![CDATA[ textarea_text3]]>
                    </TEXTAREA>
                    <INPUT>input_text3</INPUT>
                </RECORD>                                 
                 <RECORD id="4" order="4">
                     <INPUT>input_text4</INPUT>
                     <EDITOR_FIELD>
                         <![CDATA[ editor_text4]]>
                    </EDITOR_FIELD>
                     <TEXTAREA>
                         <![CDATA[ textarea_text4]]>
                    </TEXTAREA>
                </RECORD>
                 <RECORD id="5" order="5">
                     <INPUT>input_text5</INPUT>
                     <EDITOR_FIELD>
                         <![CDATA[ editor_text5]]>
                     </EDITOR_FIELD>
                     <TEXTAREA>
                         <![CDATA[ textarea_text5]]>
                     </TEXTAREA>
                 </RECORD>
                 <RECORD id="6" order="6">
                     <INPUT>input_text6</INPUT>
                     <EDITOR_FIELD>
                         <![CDATA[ editor_text6]]>
                     </EDITOR_FIELD>
                     <TEXTAREA>
                         <![CDATA[ textarea_text6]]>
                     </TEXTAREA>
                 </RECORD>                                                                
            </CONTAINER>            
        </ITEM>
    </ITEMS>    
</QUERY>

Теперь, когда в первом и во втором теге INPUT нет значения, результат должен быть следующим:
Код

input_text3
--------------
input_text4
--------------
input_text5
--------------
input_text6

Мой шаблон не умеет справляться с этим. Никак не поучается довести его до универсального состояния...
Уважаемые коллеги и знатоки хсл, помогите пожалуйста исправить шаблон так, чтобы он корректно работал. Тоесть, чтобы всегда было верно следующее условие:
В начале рисуем- Первое значение, затем линию(HR)
Второе значение затем опять линию(HR) и так далее...
Но когда мы рисуем последнее значение, то после него НЕ НУЖНО рисовать линию.
П-о-м-о-г-и-т-е...
PM MAIL   Вверх
diadiavova
Дата 30.3.2010, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="/">
      <html>
        <head>
          <title>inputs</title>
        </head>
        <body>
          <xsl:apply-templates select="//INPUT"/>
        </body>
      </html>
    </xsl:template>
  <xsl:template match="INPUT">
    <xsl:apply-templates/>
    <xsl:if test="../following::RECORD/INPUT and ./text()">
      <xsl:text>
</xsl:text>
      <hr style="border-bottom: 1px solid #c9d1dc;"/>
      <xsl:text>
</xsl:text>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

Я всё ессно по-другому сделал smile 


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


Опытный
**


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

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



diadiavova , спасибо большое. Буду пробовать ваш шаблон.

PM MAIL   Вверх
t77
  Дата 31.3.2010, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



diadiavova, слишком круто для меня...
пытаюсь понять, что вы тут написали... Тяжеловато smile 
Вы не могли бы прокоментировать строки, для ясности.
После просмотра вашего кода, возникли несколько вопросов...
1) Где вы распечатываете само значение тега INPUT ?
2) Что касается выражения - apply-templates, а что если на страничке имеются большое количество разных шаблонов, которые не относятся к данной задаче? На сколько я понимаю, выражение apply-templates вызывает все шаблоны поочереди. Объясните пожалуйста.
3) И еще, почему нет петли for-each ??
Спасибо.

PM MAIL   Вверх
diadiavova
Дата 31.3.2010, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(t77 @  31.3.2010,  10:06 Найти цитируемый пост)
1) Где вы распечатываете само значение тега INPUT ?

строка 11

Цитата(t77 @  31.3.2010,  10:06 Найти цитируемый пост)
На сколько я понимаю, выражение apply-templates вызывает все шаблоны поочереди. Объясните пожалуйста.

Я уже объяснял, но попытаюсь ещё раз. Во-первых надо сказать, что это одна из главных фич языка, которая позволяет в разы сократить логику(и соответственно количество кода). Вызывает она не все шаблоны, а указанные в ней элементы(по-умолчанию это узлы-потомки текущего узла, но это можно изменить атрибутом select). Каждый элемент обрабатывается наиболее соотвтствующим ему шаблоном, который подбирается автоматически. 
Цитата(t77 @  31.3.2010,  10:06 Найти цитируемый пост)
И еще, почему нет петли for-each

Потому что она там не нужна. Вообще в большинстве случаев, когда народ пытается использовать for-each, это не нужно и лучше этого не делать. Бывают сложные случаи, когда использование форичей упрощает логику, для этого и ввели, но чаще всего форич используется не по назначению. И кстати говоря, форич - не цикл, xslt -функциональный язык и здесь нет ни циклов, ни переменных, ни манипуляций с памятью. Привыкай smile 


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


Опытный
**


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

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



Да, конечно вы объясняли как то, но до конца я все равно не въехал в это дело...
 smile 
Обалдеть можно...
Да уж, нужно привыкнуть. smile 
Тем не менее, если можно, то хочу коментарии к приведенному вами коду.
 smile 
Спасибо.

PM MAIL   Вверх
t77
  Дата 31.3.2010, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



И еще, вы понимаете, что тег, значение которого необходимо распечатывать может быть другим... Тоесть не обязательно INPUT.
Может быть TEXTAREA или EDITOR_FIELD.
Также назавание прородителя тоже может быть любым. Не обязательно CONTAINER.
Исходя из этого, если вы обратили внимание, я в основном шаблоне передаю следующие параметры:
containerName - название контейнера
elementName - название тега, для распечатки его значения
urlLoc - запрос на файл хмл, так как данные считываются с другого хмл документа.
Так, что не получается так как вы советуете...

PM MAIL   Вверх
diadiavova
Дата 31.3.2010, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Там всё просто. В основном шаблоне(/) формируется выходной документ. В том месте, где надо вставить результат обработки инпутов я ставлю apply-template с указанием откуда брать данные(//INPUT). Есть так же шаблон, предназначенный для обработки элементов INPUT, соответственно инпуты обрабатываться будут именно им. Я в предыдущем посте указал, что содержимое инпутов в 11 строке выкладывается - ошибся. Оно выкладывается в строке 16, поскольку у инпутов единственным узлом-потомком является текстовый узел, то он в этом месте и прописывается. 
Далее идёт условие, нам надо, чтобы после обработки инпута вставлялся элемент hr, но при выполнении двух условий: этот элемент должен быть не последним в списке и сам должен содержать текст. Первое условие определяется выражением ../following::RECORD/INPUT, второе - ./text(). Поскольку они должны быть выполнены оба объединяем их оператором and
Здесь нужно сделать пару оговорок: 
1. Условия описываются выражениями, возвращающими наборы узлов, а не булевы значения, это может выгядеть странно, но для языков с динамической типизацией нормальное явление. При приведении набора узлов к булевому типу он возвращает true только если в нём есть узлы(пустой набор возвратит false).

2.Я в условии не учёл того, что пустыми могут оказаться не только первые инпуты, но и любые другие, а если они окажутся в конце, то могут появиться лишние линии, так что не помешало бы проверить это и если что, то в первом условии надо добавить фильтр пустых узлов
 
Код

../following::RECORD/INPUT[text()]

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

Ну и элементы text там не нужны, добавил их просто для того, чтобы в выходном документе отформатировать элементы, а то они на одной строчке лепились.


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


Опытный
**


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

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



diadiavova,вы читали, что я вам написал в предыдущем сообщении...??

Цитата

тег, значение которого необходимо распечатывать может быть другим... Тоесть не обязательно INPUT.
Может быть TEXTAREA или EDITOR_FIELD.
Также назавание прородителя тоже может быть любым. Не обязательно CONTAINER.
Исходя из этого, если вы обратили внимание, я в основном шаблоне передаю следующие параметры:
containerName - название контейнера
elementName - название тега, для распечатки его значения
urlLoc - запрос на файл хмл, так как данные считываются с другого хмл документа.


Как быть, с шаблоном: 
Цитата

Есть так же шаблон, предназначенный для обработки элементов INPUT, соответственно инпуты обрабатываться будут именно им


PM MAIL   Вверх
diadiavova
Дата 31.3.2010, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

Добавлено через 10 минут и 15 секунд
Цитата(t77 @  31.3.2010,  15:35 Найти цитируемый пост)
diadiavova,вы читали, что я вам написал в предыдущем сообщении...??

Кстати, этого поста я не видел, очевидно он появился, когда я писал ответ на предыдущий. 


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


Опытный
**


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

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



Знаю, что замучил вас уже...
И нивкоем случае не надеялся получить код для копи паст... smile 
Мне в данном случае намного важно понять, то, что я делаю, чем решить задачу и забыть...
Не знаю насколько это детская задача, но у меня не получается создать шаблон:
Код

<xsl:template match="INPUT">
                        <xsl:apply-templates/>
                        <xsl:if test="../following::RECORD/INPUT and ./text()">
                            <xsl:text></xsl:text>
                            <hr style="border-bottom: 1px solid #c9d1dc;"/>
                            <xsl:text></xsl:text>
                        </xsl:if>
                    </xsl:template>

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


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


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

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



На счёт элементов text, в таком виде они вообще бесполезны, уже говорил, что ввёл их для того, чтобы вставить переход на другую строку(лучше для этой цели использовать 
Код




Но в принципе на структуру выходного  документа они вообще не влияют(вставлены для форматирования)
Цитата(t77 @  31.3.2010,  16:10 Найти цитируемый пост)
но у меня не получается создать шаблон
Цитата(t77 @  31.3.2010,  16:10 Найти цитируемый пост)
так, чтобы он получал динамическое значение...
Если бы я знал, что такое "динамическое значение", то подсказал бы.
Вообще, в принципе говорить о том, чтобы написать преобразование для документа, о структуре которого практически ничего не известно, имхо - нелепо. Написать для шаблона каким узлам он должен соответствовать нетрудно, но как я могу это сформулировать, если сам не понимаю что нужно? smile 

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

Вот к примеру можно как-то так поменять
Код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes"/>
    <xsl:template match="/">
      <html>
        <head>
          <title>inputs</title>
        </head>
        <body>
          <xsl:apply-templates select="ITEM/*/*/*"/>
        </body>
      </html>
    </xsl:template>
  <xsl:template match="ITEM/*/*/*">
    <xsl:apply-templates/>
    <xsl:if test="../following::*/* and ./text()">
      <hr style="border-bottom: 1px solid #c9d1dc;"/>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>
В принципе должно выстрелить, но такие шаблоны по мере разрастания условий становится трудно контролировать


Это сообщение отредактировал(а) diadiavova - 31.3.2010, 16:02


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


Опытный
**


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

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



Цитата

Если бы я знал, что такое "динамическое значение", то подсказал бы.

Я имел ввиду, что название нода, может меняться.
Если структура хмл файла следующая:
Код

<QUERY>
     <ITEMS>
         <ITEM>
             <CONTAINER1>
                 <RECORD id="1" order="1">
                     <INPUT>input_text1</INPUT>
                     <TEXTAREA>
                         <![CDATA[textarea_text1]]>
                     </TEXTAREA>
                     <EDITOR_FIELD>
                         <![CDATA[ editor_text1]]>
                     </EDITOR_FIELD>
                 </RECORD>
                 <RECORD id="2" order="2">
                     <EDITOR_FIELD>
                         <![CDATA[ editor_text2]]>
                     </EDITOR_FIELD>
                     <TEXTAREA>
                         <![CDATA[ textarea_text2]]>
                     </TEXTAREA>
                     <INPUT>input_text2</INPUT>
                 </RECORD>
                 <RECORD id="3" order="3">
                     <EDITOR_FIELD>
                         <![CDATA[ editor_text3]]>
                    </EDITOR_FIELD>
                     <TEXTAREA>
                         <![CDATA[ textarea_text3]]>
                    </TEXTAREA>
                    <INPUT>input_text3</INPUT>
                </RECORD>                                 
                 <RECORD id="4" order="4">
                     <INPUT>input_text4</INPUT>
                     <EDITOR_FIELD>
                         <![CDATA[ editor_text4]]>
                    </EDITOR_FIELD>
                     <TEXTAREA>
                         <![CDATA[ textarea_text4]]>
                    </TEXTAREA>
                </RECORD>                                                                        
            </CONTAINER1>
             <CONTAINER2>
                 <RECORD id="1" order="1">
                     <TAG1>tag1_text</TAG1>
                     <RADIO>radio1_text</RADIO>
                     <LINK>link1_text</LINK>
                 </RECORD>
                 <RECORD id="2" order="2">
                     <TAG1>tag2_text</TAG1>
                     <RADIO>radio2_text</RADIO>
                     <LINK>link2_text</LINK>
                 </RECORD>
                 <RECORD id="3" order="3">
                     <TAG1>tag3_text</TAG1>
                     <RADIO>radio3_text</RADIO>
                     <LINK>link3_text</LINK>
                 </RECORD>
                 <RECORD id="4" order="4">
                     <TAG1>tag4_text</TAG1>
                     <RADIO>radio4_text</RADIO>
                     <LINK>link4_text</LINK>
                 </RECORD>
             </CONTAINER2>                    
        </ITEM>
    </ITEMS>    
</QUERY>

Следует учесть тот факт, что тег CONTAINER, может встречаться в хмл файле как CONTAINER1, CONTAINER2, CONTAINER3 и 
так далее.
Так же внутри этого самого нода CONTAINER, могут быть совершенно разные названия нодов-деток:
INPUT, TEXTAREA, EDITOR_FIELD, TAG1, RADIO, LINK

Но, каждый раз, когда я хочу распечатать значения определенного нода, который находится в определенном CONTAINER-Е, я знаю и название нода и название CONTAINER-А. 
Это в настройках системы пользователь может решить/выбрать, какой нод и какого контейнера он хочет видеть. Понимаете, это очень важно!
Я не могу просто ограничеться названием нода прородителя и звездочками, как вы мне советуете...
Именно поэтому мне нужно передавать основному шаблону имя контейнера и имя нода, значения которого я хочу распечатать. Именно эти два параметра я получаю от пользователя.
Вот, что я называю динамический. Вопрос можно ли передать шаблону:
Код

<xsl:template match="ITEM/*/*/*">
    <xsl:apply-templates/>
    <xsl:if test="../following::*/* and ./text()">
      <hr style="border-bottom: 1px solid #c9d1dc;"/>
    </xsl:if>
  </xsl:template>

название нода/тега ??
Я не очень силен в xsl, и поэтому не знаю как это можно сделать. Помогите пожалуйста.
Заранее благодарю.

PM MAIL   Вверх
diadiavova
Дата 31.3.2010, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Параметры преобразованию можно передавать, для этого на верхнем уровне создаётся элементl-param и уже он используется для всех дальнейших операций. Проблема в том, что механизм передачи значений параметрам верхнего уровня в спецификации формата не прописан. Означает это только одно: способ передачи параметров зависит от реализатора xslt-процессора. Если преобразование выполняется в собственном приложении, то описание способа надо искать в документации по используемым xml-api, если используется какой-то готовый софт, то в документации по этому софту. Но та или иная реализация процессора или апи не гарантирует наличия такой возможности, поскольку спецификация не требует, чтобы она была.
Проблему можно решить если использовать внешний xml-файл, можно преобразование генерировать динамически, тут всё зависит от условий и доступных инструментов. Хотя, как мне кажется, если возникла потребность написать одно преобразование для файлов неизвестно какой структуры, то скорей всего всё приложение спроектировано неправильно. 
Указать тэги, имена которых начинаются одинаково можно, но тут проблема немного в другом...такой ситуации в принципе быть не должно, если есть необходимость иметь однотипные элементы, но чем-то отличающиеся друг от друга, для этого обычно используются атрибуты, то есть можно создать элемент CONTAINER и задать ему атрибут к примеру container-type и там уже указывать 1, 2 или 3. А при таком формате документа данная проблема будет не единственной, гемора будет много при обработке такого документа на любом языке. Но если в этом есть необходимость(хотя я практически уверен, что это не так), то элементы с такими именами можно обозначить так
Код

*[starts-with(Name(), 'CONTAINER')]
Этот шаблон отбирает все узлы, имена которых начинаются с CONTAINER

Это сообщение отредактировал(а) diadiavova - 31.3.2010, 23:48


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


Опытный
**


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

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



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

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

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

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

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


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

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


 




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


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

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