powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT - создание за один проход нескольких паралельных узлов
3 сообщений из 3, страница 1 из 1
XSLT - создание за один проход нескольких паралельных узлов
    #40073822
LeoArslan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Окажите помощь пожалуйста.
Имеется xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<?xml version="1.0" encoding="UTF-8"?>
<doc>
<record>
   <city>city1</city>    
   <status>status_city1</status>
   <type>type_city1</type>
</record>   
<record>   
   <city>city2</city>    
   <status>status_city2</status>
   <type>type_city2</type>
 </record>   
</doc>


Имеем xslt
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:template match="/">
    <root>
    <xsl:for-each select="doc/record">
           <ROW>
                <col1>
                    <xsl:value-of select="./city"/>
                </col1>
                <col2>
                    <xsl:value-of select="./status"/>
                </col2>
            </ROW>
            <ROW>
                <col1>
                    <xsl:value-of select="./city"/>
                </col1>
                <col2>
                    <xsl:value-of select="./type"/>
                </col2>
            </ROW>
    </xsl:for-each>
    </root>
  </xsl:template>
</xsl:transform>


т.е. для каждого doc/record/city создаем два <row>, в первое row попадает <status> во второе row <type>

Получаем
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <ROW>
      <col1>city1</col1>
      <col2>status_city1</col2>
   </ROW>
   <ROW>
      <col1>city1</col1>
      <col2>type_city1</col2>
   </ROW>
   <ROW>
      <col1>city2</col1>
      <col2>status_city2</col2>
   </ROW>
   <ROW>
      <col1>city2</col1>
      <col2>type_city2</col2>
   </ROW>
</root>



В моем варианте я явно создаю два раза row. А вот можно ли изменить xslt так что бы общая часть <row><col1> создавалась параллельно за один проход, а col2 наприме по условию, так как в реальной задаче <col1> представляет из себя большой список узлов и дважды его описывать или выносить в функцию не очень нравиться.
...
Рейтинг: 0 / 0
XSLT - создание за один проход нескольких паралельных узлов
    #40073858
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeoArslan
А вот можно ли изменить xslt так что бы общая часть <row><col1> создавалась параллельно за один проход
Нет. Вернее можно организовать еще один цикл
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<xsl:for-each select="doc/record">
  <xsl:for-each select="*[position() &gt; 1]">
    <ROW>
      <col1>
        <xsl:value-of select="../city"/>
      </col1>
      <col2>
        <xsl:value-of select="."/>
      </col2>
    </ROW>
  </xsl:for-each>
</xsl:for-each>

но теряется наглядность кода и логики
LeoArslan
так как в реальной задаче <col1> представляет из себя большой список узлов и дважды его описывать или выносить в функцию не очень нравиться.
Вынесите общие действия в отдельный именованный шаблон
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:template match="/">
    <root>
    <xsl:for-each select="doc/record">
      <ROW>
        <xsl:call-template name="printCol1"/>
        <col2>
          <xsl:value-of select="./status"/>
        </col2>
      </ROW>
      <ROW>
        <xsl:call-template name="printCol1"/>
        <col2>
          <xsl:value-of select="./type"/>
        </col2>
      </ROW>
    </xsl:for-each>
    </root>
  </xsl:template>

  <xsl:template name="printCol1">
    <col1>
      <xsl:value-of select="./city"/>
    </col1>
  </xsl:template>
</xsl:transform>
...
Рейтинг: 0 / 0
XSLT - создание за один проход нескольких паралельных узлов
    #40073882
LeoArslan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,
Спасибо за идею с вложенным циклом. Обдумаю.
На отдельной именованный шаблон сейчас и остановился
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT - создание за один проход нескольких паралельных узлов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (9): Анонимы (6), Bing Bot, Yandex Bot 2 мин., CerebroSQL 2 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]