Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Похоже переманные нельзя переприсваивать в XSLT - но наверняка есть альтернатива. / 6 сообщений из 6, страница 1 из 1
22.06.2012, 17:52
    #37850852
swimguy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Похоже переманные нельзя переприсваивать в XSLT - но наверняка есть альтернатива.
Всем Привет,
есть вот такая задачка но из за отсутствия поддержи пересвоения глобальных переменых и малого опыта с 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
23.06.2012, 00:20
    #37851181
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Похоже переманные нельзя переприсваивать в XSLT - но наверняка есть альтернатива.
Ничего не понял. Вам это нужно?
Код: 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
24.06.2012, 15:48
    #37852187
swimguy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Похоже переманные нельзя переприсваивать в XSLT - но наверняка есть альтернатива.
Спасибо! очень близко, только список нодов которые надо обрабатывать должен быть указан непосредственно (я указал этот списока в <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
24.06.2012, 16:53
    #37852218
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Похоже переманные нельзя переприсваивать в XSLT - но наверняка есть альтернатива.
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
24.06.2012, 16:54
    #37852221
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Похоже переманные нельзя переприсваивать в XSLT - но наверняка есть альтернатива.
_Vasilisk_Значит у Вас где-то объявлен шаблон для InstructorВернее не так. Где-то у Вас есть еще такой шаблон
Код: xml
1.
2.
3.
<xsl:template match="*" mode="staff">
  ................
</xsl:template>
...
Рейтинг: 0 / 0
25.06.2012, 23:26
    #37854045
swimguy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Похоже переманные нельзя переприсваивать в XSLT - но наверняка есть альтернатива.
Разобрался, спасибо за помощь!
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Похоже переманные нельзя переприсваивать в XSLT - но наверняка есть альтернатива. / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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