powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Похоже переманные нельзя переприсваивать в XSLT - но наверняка есть альтернатива.
6 сообщений из 6, страница 1 из 1
Похоже переманные нельзя переприсваивать в XSLT - но наверняка есть альтернатива.
    #37850852
swimguy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем Привет,
есть вот такая задачка но из за отсутствия поддержи пересвоения глобальных переменых и малого опыта с xslt не могу исключить/не добовлять повторяющиеся ноды:

Примеры фаилов и результат:
Cурс фаил N 1.
Код: xml
1.
2.
3.
4.
5.
6.
7.
<all>
<staff>
 <Instructor>Sereja</Instructor>
 <Bugalter>Vera</Bugalter>
 <Sofer>Vania</Sofer>
</staff>
</all>


ожидаемый результат 1:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?xml version="1.0" encoding="utf-8"?>
<xrefIdentifiers xmlns:dyn="http://exslt.org/dynamic">
  <xId3>
    <xId>Sereja</xId>
    <xIdType>Instructor</xIdType>
  </xId3>
  <xId4>
    <xId>Vera</xId>
    <xIdType>Bugalter</xIdType>
  </xId4>
  <xId5>
    <xId>Vania</xId>
    <xIdType>Sofer</xIdType>
  </xId5>
</xrefIdentifiers>



Сурс фаил 2.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<all>
<staff>
 <Instructor>Sereja</Instructor>
 <Bugalter>Vera</Bugalter>
 <Director>Vladimir</Director>
 <Dev>Vasea</Dev>
 <Sofer>Vania</Sofer> 
</staff>
<all>


ожидаемый результат 2:
Код: 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="utf-8"?>
<xrefIdentifiers xmlns:dyn="http://exslt.org/dynamic">
  <xId3>
    <xId>Sereja</xId>
    <xIdType>Instructor</xIdType>
  </xId3>
  <xId4>
    <xId>Vera</xId>
    <xIdType>Bugalter</xIdType>
  </xId4>
  <xId5>
    <xId>Vladimir</xId>
    <xIdType>Director</xIdType>
  </xId5>
  <xId6>
    <xId>Vasea</xId>
    <xIdType>Dev</xIdType>
  </xId6>
  <xId7>
    <xId>Vania</xId>
    <xIdType>Sofer</xIdType>
  </xId7>
</xrefIdentifiers>



вот текущий 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dyn="http://exslt.org/dynamic">
  <xsl:output method="xml" omit-xml-declaration="yes" />
  <xsl:variable name="xrefs" select="all/staff/Director|all/staff/Bugalter|all/staff/Instructor|all/staff/Sofer" />
  <xsl:template name="xref.loop">
    <xsl:param name="i" />
    <xsl:param name="count" />
    <xsl:if test="$i <= $count">
      <xsl:for-each select="$xrefs">
<!--        <xsl:if test="$i <= $count">-->
            <xsl:text disable-output-escaping="yes"><![CDATA[<xId]]></xsl:text>
            <xsl:value-of select="$i" />
            <xsl:text disable-output-escaping="yes"><![CDATA[>]]></xsl:text>
            <xId>
                        <xsl:value-of select="dyn:evaluate(concat('../',local-name()))" />
            </xId>
            <xIdType instrumentIdTypeScheme="http://www.eagleinvsys.com/coding-scheme/instrumentid-type-2-0">
              <xsl:value-of select="local-name()" />
            </xIdType>
            <xsl:text disable-output-escaping="yes"><![CDATA[</xId]]></xsl:text>
            <xsl:value-of select="$i" />
            <xsl:text disable-output-escaping="yes"><![CDATA[>]]></xsl:text>
<!--        </xsl:if>-->
      </xsl:for-each>
    </xsl:if>
    <xsl:if test="$i <= $count">
      <xsl:call-template name="xref.loop">
        <xsl:with-param name="i">
          <xsl:value-of select="$i + 1" />
        </xsl:with-param>
        <xsl:with-param name="count">
          <xsl:value-of select="$count" />
        </xsl:with-param>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
  <xsl:template match="/all">
    <xsl:for-each select="/all/staff">
    <xrefIdentifiers>
      <xsl:call-template name="xref.loop">
        <xsl:with-param name="i" select="3" />
        <xsl:with-param name="count">10</xsl:with-param>
      </xsl:call-template>
    </xrefIdentifiers>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>



Текущий результат:
Код: 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="utf-8"?>
<xrefIdentifiers xmlns:dyn="http://exslt.org/dynamic">
  <xId3>
    <xId>Sereja</xId>
    <xIdType>Instructor</xIdType>
  </xId3>
  <xId3>
    <xId>Vera</xId>
    <xIdType>Bugalter</xIdType>
  </xId3>
  <xId3>
    <xId>Vania</xId>
    <xIdType>Sofer</xIdType>
  </xId3>
  <xId4>
    <xId>Sereja</xId>
    <xIdType>Instructor</xIdType>
  </xId4>
  <xId4>
    <xId>Vera</xId>
    <xIdType>Bugalter</xIdType>
  </xId4>
  <xId4>



Идея была в закоменченый xsl:if вставлять проверку по глобальной переменной для исключения того что уже включилось.
Подскажите пожалуйста как реализовать.
Заранее спасибо!
...
Рейтинг: 0 / 0
Похоже переманные нельзя переприсваивать в XSLT - но наверняка есть альтернатива.
    #37851181
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего не понял. Вам это нужно?
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<xsl:template match="staff">
  <xsl:apply-templates select="*" mode="staff"/>
</xsl:template>

<xsl:template match="*" mode="staff">
  <xsl:element name="{concat('xId', position() + 2)}">
    <xId>
      <xsl:value-of select="."/>
    </xId>
    <xIdType>
      <xsl:value-of select="local-name(.)"/>
    </xIdType>
  </xsl:element>
</xsl:template>
...
Рейтинг: 0 / 0
Похоже переманные нельзя переприсваивать в XSLT - но наверняка есть альтернатива.
    #37852187
swimguy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! очень близко, только список нодов которые надо обрабатывать должен быть указан непосредственно (я указал этот списока в <xsl:template match="):

Код: 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:template match="staff">
 <Res>
  <xsl:apply-templates select="*" mode="staff"/>
 </Res>
</xsl:template>

<xsl:template match="all/staff/Director|all/staff/Bugalter" mode="staff">
  <xsl:element name="{concat('xId', position() + 2)}">
    <xId>
      <xsl:value-of select="."/>
    </xId>
    <xIdType>
      <xsl:value-of select="local-name(.)"/>
    </xIdType>
  </xsl:element>
</xsl:template>
</xsl:stylesheet>



он вроде формирует структуру по ним, но почему-то генерирует как текст значения из других нод:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<Res>
 Sereja
<xId4>
 <xId>Vera</xId>
 <xIdType>Bugalter</xIdType>
 </xId4>
<xId5>
 <xId>Vladimir</xId>
 <xIdType>Director</xIdType>
 </xId5>
 VaseaVania
 </Res>



можно этого избежать?
...
Рейтинг: 0 / 0
Похоже переманные нельзя переприсваивать в XSLT - но наверняка есть альтернатива.
    #37852218
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
swimguy(я указал этот списока в <xsl:template match="):Зачем?
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<xsl:template match="staff">
 <Res>
  <xsl:apply-templates select="Director|Bugalter" mode="staff"/>
 </Res>
</xsl:template>

<xsl:template match="*" mode="staff">
  ................
</xsl:template>

swimguyон вроде формирует структуру по ним, но почему-то генерирует как текст значения из других нод:Значит у Вас где-то объявлен шаблон для Instructor
...
Рейтинг: 0 / 0
Похоже переманные нельзя переприсваивать в XSLT - но наверняка есть альтернатива.
    #37852221
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Значит у Вас где-то объявлен шаблон для InstructorВернее не так. Где-то у Вас есть еще такой шаблон
Код: xml
1.
2.
3.
<xsl:template match="*" mode="staff">
  ................
</xsl:template>
...
Рейтинг: 0 / 0
Похоже переманные нельзя переприсваивать в XSLT - но наверняка есть альтернатива.
    #37854045
swimguy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разобрался, спасибо за помощь!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Похоже переманные нельзя переприсваивать в XSLT - но наверняка есть альтернатива.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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