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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XSLT, аналог include 
:(
    Опции темы
Luc1fer
Дата 3.11.2004, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Народ, каким образом можно написать XSLT шаблон,
чтобы сымулировать команду include. Т. е.:
Есть xml файл

<?xml version="1.0" encoding="windows-1251"?>

<Root xmlns:xpl="http://www.itslab.niks.by">
<c>Привет</c>
<d>
<xpl:include select="../../c"
</d>
</Root>

На этот файл нужно наложить такой шаблон, чтобы выходной файл

выглядел след образом:

<Root xmlns:xpl="http://www.itslab.niks.by">
<c>Привет</c>
<d>
<c>Привет</c>
</d>
</Root>

Моя идея:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="include">
<xsl:value-of select="@select"/> - только как сделать, чтобы в value-of попадало именно значение @select?????????
</xsl:template>
</xsl:stylesheet>


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


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Код

<xsl:import href="URL"/>


Не подойдёт?


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Ignat
Дата 4.11.2004, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Цитата(3)

Не подойдёт?

Похоже нет.
У меня первая мысль тоже была - импорт шаблона.

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


--------------------
Теперь при чем :P
PM   Вверх
3,14
Дата 5.11.2004, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Цитата(Ignat @ 4.11.2004, 10:11)

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

Тады xsl:copy юзать нуно



--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Ignat
Дата 5.11.2004, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Цитата(3)
Тады xsl:copy юзать нуно

smile Расскажи, интересно.


--------------------
Теперь при чем :P
PM   Вверх
3,14
Дата 6.11.2004, 02:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Возьмём XML:
Код

<root>
 <node key="1">
   <subnode1.1>
     <test1.1>test1.1</test1.1>
   </subnode1.1>
   <subnode1.2>
     <test1.2>test1.2</test1.2>
   </subnode1.2>
   <subnode1.3>
     <test1.3>test1.3</test1.3>
   </subnode1.3>
 </node>
 <node key="2">
   <subnode2.1>
     <test2.1>test2.1</test2.1>
   </subnode2.1>
   <subnode2.2>
     <test2.2>test2.2</test2.2>
   </subnode2.2>
   <subnode2.3>
     <test2.3>test2.3</test2.3>
   </subnode2.3>
 </node>
 <node key="3">
   <subnode3.1>
     <test3.1>test3.1</test3.1>
   </subnode3.1>
   <subnode3.2>
     <test3.2>test3.2</test3.2>
   </subnode3.2>
   <subnode3.3>
     <test3.3>test3.3</test3.3>
   </subnode3.3>
 </node>
</root>


Чтоб скопировать из него содержимое ноды с ключом 2 применим XSL:
Код

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml"/>

<xsl:template match='/root'>
 <SECOND_NODE>
  <xsl:for-each select="node[@key=2]">
    <xsl:apply-templates/>
  </xsl:for-each>
 </SECOND_NODE>
</xsl:template>

<xsl:template match='*|@*'>
 <xsl:copy>
    <xsl:apply-templates select='node()|@*'/>
 </xsl:copy>
</xsl:template>

</xsl:stylesheet>


И как результат получим:
Код

<?xml version="1.0" encoding="UTF-16"?>
<SECOND_NODE>
 <subnode2.1>
   <test2.1>test2.1</test2.1>
 </subnode2.1>
 <subnode2.2>
  <test2.2>test2.2</test2.2>
 </subnode2.2>
 <subnode2.3>
   <test2.3>test2.3</test2.3>
 </subnode2.3>
</SECOND_NODE>



--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Luc1fer
Дата 25.11.2004, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Енто все ясно.

Мне нужно, чтоб шаблон распознал мою команду,
например <xpl:include select="../../c"/>
взял атрибут select и вставил на место
этой команды то, что он выбрал в select
PM MAIL   Вверх
3,14
Дата 25.11.2004, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



../../c - это файл или node текущего документа?


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Luc1fer
Дата 25.11.2004, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вообще-то узел, но в принципе
должно выбирать из файла список узлов,
аля dociment("1.txt")/Root
PM MAIL   Вверх
Ignat
Дата 25.11.2004, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Luc1fer, объясните, пожалуйста, понятнее.
Если
Цитата(Luc1fer @ 25.11.2004, 17:13)
вообще-то узел,
то
Цитата(3)
xsl:copy юзать нуно


если же
Цитата(Luc1fer @ 25.11.2004, 17:13)
выбирать из файла
то
Цитата(3)
<xsl:import href="URL"/>


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



--------------------
Теперь при чем :P
PM   Вверх
Luc1fer
Дата 25.11.2004, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Попробую)

Итак, есть xml документ, в котором
встречается тег -
<xpl:include>
<Select>/Root/1</Select>
<File>1.xml</File>
<Directory>c:/1/</Directory>
</xpl:include>

После обработки файла с этой командой вместо
нее должно стоять то, что выберет XPath из
c:/1/1.xml
Мой вариант для простого включения файла:
Код

<xsl:template match="Include[File]">
 <xsl:choose>
  <xsl:when test="Directory">
   <xsl:apply-templates select='document(
                   concat(Directory/text(),"/",File/text()))'/> -->
   <xsl:apply-templates select='concat("document('")'/>
           
  </xsl:when>
  <xsl:otherwise>
   <xsl:apply-templates select='document(File/text())'/>    
  </xsl:otherwise>
 </xsl:choose>
</xsl:template>  

Изврат еще и в том, что в подключаемом файле может также
находиться <xpl:include>))

В этом варианте весь вопрос в том, как к
document(concat(Directory/text(),"/",File/text()))
еще приклеить значение select.
Так нельзя - concat(document(concat(Directory/text(),"/",
File/text())), select/text())
Так проблема с незнаючем
<xsl:apply-templates select="concat( 'document(' ,Directory/text(), '/' , File/text(),')' )"/>
PM MAIL   Вверх
3,14
Дата 26.11.2004, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Всё равно не понял чем этот вариант отличается от обычного включения файла,
запости какой-нибудб пример исходных данных и того что должно получится smile


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Luc1fer
Дата 29.11.2004, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Хорошо пример
Файл 1.xml

<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<Root xmlns:xpl="http://www.itslab.niks.by">
<xpl:include>
<Directory>c/myDir</Directory>
<File>2.xml</File>
<Select>/Root/car</Select>
</xpl:include>
</Root>


Файл 2.xml

<?xml version="1.0" encoding="windows-1251"?>
<Root xmlns:xpl="http://www.itslab.niks.by">
<car>
<xpl:include>
<Directory>c/myDir</Directory>
<File>3.xml</File>
<Select>/Root/car</Select>
</xpl:include>
</car>
</Root>

Файл 3.xml

<?xml version="1.0" encoding="windows-1251"?>
<Root xmlns:xpl="http://www.itslab.niks.by">
<car>
BMW
<Color>Blue</Color>
</car>
</Root>

После обработки 1.xml получим:
<Root xmlns:xpl="http://www.itslab.niks.by">
<car>
<car>
BMW
<Color>Blue</Color>
</car>
</car>
</Root>

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


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Однако попотеть пришлось, вот пример там немного менять нужно:
test.xml:
Код

<?xml-stylesheet type="text/xsl" href="C:\temp\test.xsl"?>
<Root>
<Link>
 <select>Root2/text</select>
 <URI>test2.xml</URI>
</Link>
<Link>
 <URI>test2.xml</URI>
</Link>
</Root>

test2.xml:
Код

<?xml-stylesheet type="text/xsl" href="C:\temp\test.xsl"?>
<Root2>
<text>TEXT1</text>
<text>TEXT2</text>
</Root2>

test.xsl:
Код

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
 <xsl:template match="Link">
    <xsl:choose>
     <xsl:when test="string-length(select)">
         <xsl:call-template name="node_search">
           <xsl:with-param name="URI" select="URI"/>
           <xsl:with-param name="node_name" select="select"/>
         </xsl:call-template>
     </xsl:when>
     <xsl:otherwise>
        <xsl:apply-templates select="document(URI)"/>
     </xsl:otherwise>
    </xsl:choose>
 </xsl:template>
 
 <xsl:template match="*|node()">
   <xsl:copy>
    <xsl:apply-templates/>
   </xsl:copy>
 </xsl:template>
 
 <xsl:template name="node_search">
   <xsl:param name="URI"/>
   <xsl:param name="node_name"/>
   <xsl:param name="history"/>
   <xsl:choose>
      <xsl:when test="string-length($URI)">
        <xsl:for-each select="document($URI)/*">
           <xsl:choose>
              <xsl:when test="name() = $node_name">
               <xsl:apply-templates select="/"/>
              </xsl:when>
              <xsl:otherwise>
               <xsl:call-template name="node_search">
                  <xsl:with-param name="node_name" select="$node_name"/>
                  <xsl:with-param name="history" select="name()"/>
               </xsl:call-template>
              </xsl:otherwise>
           </xsl:choose>          
        </xsl:for-each>
      </xsl:when>
      <xsl:otherwise>
        <xsl:for-each select="*">
           <xsl:choose>
              <xsl:when test="concat($history,'/',name()) = $node_name">
               <xsl:apply-templates select="current()"/>
              </xsl:when>
              <xsl:otherwise>
               <xsl:call-template name="node_search">
                  <xsl:with-param name="node_name" select="$node_name"/>
                  <xsl:with-param name="history" select="concat($history,'/',name())"/>
               </xsl:call-template>
              </xsl:otherwise>
           </xsl:choose>          
        </xsl:for-each>
      </xsl:otherwise>
   </xsl:choose>
 </xsl:template>
 
</xsl:stylesheet>

И результат:
Код

<?xml version="1.0" encoding="UTF-16"?>
 <Root>
   <text>TEXT1</text>
   <text>TEXT2</text>
   <Root2>
     <text>TEXT1</text>
     <text>TEXT2</text>
   </Root2>
</Root>


А зачем такое нуно если не секрет?


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Luc1fer
Дата 1.12.2004, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Очень просто). Я пишу на Java, а в XSLT - полный дуб(вековой).
Работаем над проектом, аля Semantic-web. Я занимаюсь
написанием компилятора нового веб-языка)), если можно так сказать.

Так вот в этом языке есть такая команда include - которая
позволяет вставить в текущее место документа некоторый набор
узлов. Меня попросили сделать тоже самое без Java или
JavaScript, средствами XSL. Я дошел до
Код

 <xsl:template match="Include[File]">
 <xsl:choose>
  <xsl:when test="Directory">
   <xsl:apply-templates select='document(
            concat(Directory/text(),"/",File/text()))'/>                
 </xsl:when>
 <xsl:otherwise>
  <xsl:apply-templates select='document(File/text())'/>    
 </xsl:otherwise>
</xsl:choose>
</xsl:template>  


Но все портит эта строка -
Код

<xsl:apply-templates select='document(
            concat(Directory/text(),"/",File/text()))'/>            


Так я могу вставить файл. А как к этому еще присобачить,
что из него выбрать???

Наткнулся, что
Код

<xsl:apply-templates select="concat( 'document(' ,Directory/text(), '/' , File/text(),Select/text(),')' )"/>

Не србатывает, и мысль ушла.


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

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

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

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

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


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

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


 




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


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

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