powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT Преобразование. Увеличение количества элементов
9 сообщений из 9, страница 1 из 1
XSLT Преобразование. Увеличение количества элементов
    #39382092
Алымов Анатолий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак пока не въеду как написать шаблон, чтобы каждый элемент в xml увеличить на столько раз, сколько у него вложенных элементов определенных и соответственно в получившемся элементе был только один.

Пример исходного элемента:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?xml version="1.0" encoding="windows-1251" standalone="yes"?>
<registry>
  <group>
   <Paramtest Attr="test1"/>
   <subgroup subgroupnum="1" Value="0.00"/>
   <subgroup subgroupnum="2" Value="2.00"/>
   <subgroup subgroupnum="3" Value="5.00"/>
  </group>
  <group>
   <Paramtest Attr="test2"/>
   <subgroup subgroupnum="1" Value="1.00"/>
   <subgroup subgroupnum="2" Value="0.00"/>
  </group>
</registry>




Что хочется получить:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<?xml version="1.0" encoding="windows-1251" standalone="yes"?>
<registry>
  <group>
   <Paramtest Attr="test1"/>
   <subgroup subgroupnum="1" Value="0.00"/>
  </group>
  <group>
   <Paramtest Attr="test1"/>
   <subgroup subgroupnum="2" Value="2.00"/>
  </group>
  <group>
   <Paramtest Attr="test1"/>
   <subgroup subgroupnum="3" Value="5.00"/>
  </group>
  <group>
   <Paramtest Attr="test2"/>
   <subgroup subgroupnum="1" Value="1.00"/>
  </group>
  <group>
   <Paramtest Attr="test2"/>
   <subgroup subgroupnum="2" Value="0.00"/>
  </group>
</registry>
...
Рейтинг: 0 / 0
XSLT Преобразование. Увеличение количества элементов
    #39382143
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решение "в лоб":
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" />
  <xsl:template match="/">
    <registry>
      <xsl:for-each select="/registry/group/subgroup">
        <group>
          <xsl:apply-templates select="../Paramtest" />
          <xsl:copy>
            <xsl:copy-of select="@*" />
          </xsl:copy>
        </group>
      </xsl:for-each>
    </registry>
  </xsl:template>
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:copy-of select="@*" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
XSLT Преобразование. Увеличение количества элементов
    #39382144
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот так даже покороче будет:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl=" http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" />
<xsl:template match="/">
<registry>
<xsl:for-each select="/registry/group/subgroup">
<group>
<xsl:apply-templates select="../Paramtest" />
<xsl:apply-templates select="." />
</group>
</xsl:for-each>
</registry>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:copy-of select="@*" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
XSLT Преобразование. Увеличение количества элементов
    #39382146
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извините, тэг SRC забыл^
Код: 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"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" />
  <xsl:template match="/">
    <registry>
      <xsl:for-each select="/registry/group/subgroup">
        <group>
          <xsl:apply-templates select="../Paramtest" />
          <xsl:apply-templates select="." />
        </group>
      </xsl:for-each>
    </registry>
  </xsl:template>
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:copy-of select="@*" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
XSLT Преобразование. Увеличение количества элементов
    #39382284
Алымов Анатолий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, нужное направление понял
...
Рейтинг: 0 / 0
XSLT Преобразование. Увеличение количества элементов
    #39383140
Алымов Анатолий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять затык - не хватает теоретических знаний в данном вопросе. Не могу найти: есть у меня в шаблоне <xsl:for-each select="/registry/group/subgroup">. Как мне выбрать один узел из другого места в xml, где значение атрибута соответствует текущему значению атрибута или тега:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<xsl:for-each select="/registry/group/subgroup">
  <group>
    <xsl:apply-templates select="../Paramtest"/>
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <PurposeName>
        <xsl:value-of select="/registry/purpose[attribute::PurposeId=тут значение текущего]/@Name"/>
      </PurposeName>
    </xsl:copy>
  </group>
</xsl:for-each>



Т.е. в xml есть справочник, а в данных используется id, а нужно выцепить имя.
...
Рейтинг: 0 / 0
XSLT Преобразование. Увеличение количества элементов
    #39383146
Алымов Анатолий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, сам нашел, если это не изврат:
Код: xml
1.
2.
<xsl:variable name="PurposeId" select="@PurposeId"/>
<xsl:value-of select="/registry/debt_registry/purpose[attribute::PurposeId=$PurposeId]/@Name" />
...
Рейтинг: 0 / 0
XSLT Преобразование. Увеличение количества элементов
    #39383207
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алымов Анатолий,

это не изврат, правда селектор обычно сокращают до собаки, так читать проще
Код: xml
1.
<xsl:value-of select="/registry/debt_registry/purpose[@PurposeId=$PurposeId]/@Name" />
...
Рейтинг: 0 / 0
XSLT Преобразование. Увеличение количества элементов
    #39383289
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для этого есть функция current()
Код: xml
1.
<xsl:value-of select="/registry/debt_registry/purpose[@PurposeId=current()/@PurposeId]/@Name" />
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT Преобразование. Увеличение количества элементов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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