Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / вопрос по xslt / 14 сообщений из 14, страница 1 из 1
31.01.2011, 19:53
    #37089213
PavelDart
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по xslt
Доброго времени суток.
Нуждаюсь в помощи вот в таком вопросе:
в входном XML в разлиных экземплярах может содержаться или не содержаться некоторый тэг c подмножеством.
Код: plaintext
1.
2.
3.
4.
<tag>
   <subtag/>
   <subtag/>
</tag>

в результате xslt-преобразования обязательно должна быть пара:
Код: plaintext
1.
<tag_list>
</tag_list>

Вот как написать обработку в xslt отсутствующего тэга во входном XML , и добиться необходимого результата?
...
Рейтинг: 0 / 0
31.01.2011, 20:08
    #37089232
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по xslt
Код: plaintext
1.
2.
<tag_list>
  <xsl:apply-templates select="tag"/>
</tag_list>
...
Рейтинг: 0 / 0
31.01.2011, 20:21
    #37089250
PavelDart
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по xslt
_Vasilisk_
Код: plaintext
1.
2.
<tag_list>
  <xsl:apply-templates select="tag"/>
</tag_list>


практически так и делаю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<area1>
         <xsl:apply-templates select="tag_list"/>
</area1>

<xsl:template match="tag_list">
        <tag_list>
            <xsl:apply-templates select="tag"/>
        </tag_list>
</xsl:template>

 <xsl:template match="tag">
	<rowtag_list index="{position()}" ... >
        </rowtag_list>
</xsl:template>

Получается, при попытке прочитать информацию из узла <tag_list> во время xslt и возникает ошибка.
...
Рейтинг: 0 / 0
31.01.2011, 20:31
    #37089265
PavelDart
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по xslt
Если не совсем понятно поясню:
При наличии тэга во входном XML в результате xslt ожидается конструкция
Код: plaintext
1.
2.
3.
4.
5.
6.
<tag_list>
   <rowtag param1="..." ... />
   <rowtag param1="..." ... />
   ...
   <rowtag param1="..." ... />
</tag_list>

При отсутсивии тэга необходим просто пустой контейнер

Код: plaintext
1.
2.
<tag_list>
</tag_list>
...
Рейтинг: 0 / 0
31.01.2011, 21:55
    #37089399
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по xslt
PavelDartпрактически так и делаю:А Вы сделайте в точности так, а не "практически"
...
Рейтинг: 0 / 0
31.01.2011, 22:28
    #37089428
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по xslt
PavelDart
Код: plaintext
1.
2.
...
<xsl:template match="tag_list">
...
Получается, при попытке прочитать информацию из узла <tag_list> во время xslt и возникает ошибка.А разве во входном XML есть элемент tag_list ?
...
Рейтинг: 0 / 0
31.01.2011, 22:53
    #37089459
PavelDart
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по xslt
_Vasilisk_
Код: plaintext
1.
2.
3.
<tag_list>
  <xsl:apply-templates select="tag"/>
</tag_list>


Хорошо, таким образом будет описан уровень
Код: plaintext
1.
<tag></tag>

а как быть с вложенностью? Разве не так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<tag_list>
  <xsl:apply-templates select="tag"/>
</tag_list>

<xsl:template match="tag">
        <tag_list>
            <xsl:apply-templates select="subtag"/>
        </tag_list>
</xsl:template>

 <xsl:template match="subtag">
	<rowtag_list index="{position()}" ... >
        </rowtag_list>
</xsl:template>


её отдельно придётся описать?
...
Рейтинг: 0 / 0
31.01.2011, 22:54
    #37089462
PavelDart
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по xslt
refregPavelDart
Код: plaintext
1.
2.
...
<xsl:template match="tag_list">
...
Получается, при попытке прочитать информацию из узла <tag_list> во время xslt и возникает ошибка.А разве во входном XML есть элемент tag_list ?
Уже путаться начал в показаниях :)
Давайте ориентироваться по последнему посту.
...
Рейтинг: 0 / 0
31.01.2011, 23:02
    #37089474
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по xslt
PavelDartУже путаться начал в показаниях :)
Давайте ориентироваться по последнему посту.Тогда опиши еще раз XML к последнему посту. Что бы там tag_list были.
...
Рейтинг: 0 / 0
31.01.2011, 23:45
    #37089525
PavelDart
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по xslt
Входящий xml - вариант 1:
Код: plaintext
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.
<subject_list>
  <subject>
    <tag1>...</tag1>
    <tag2>...</tag2>
    <tag3>...</tag3>
    ...
    <tagN_list>
       <tagN>
         <subtag1>...</subtag1>
         <subtag2>...</subtag2>
         <subtag3>...</subtag3>
      </tagN>
      <tagN>
         <subtag1>...</subtag1>
         <subtag2>...</subtag2>
         <subtag3>...</subtag3>
      </tagN>
      ...
    </tagN_list>
  </subject>
  ...
  <subject>
    <tag1>...</tag1>
    <tag2>...</tag2>
    <tag3>...</tag3>
    ...
    <tagN_list>
       <tagN>
         <subtag1>...</subtag1>
         <subtag2>...</subtag2>
         <subtag3>...</subtag3>
      </tagN>
      <tagN>
         <subtag1>...</subtag1>
         <subtag2>...</subtag2>
         <subtag3>...</subtag3>
      </tagN>
      ...
    </tagN_list>
  </subject>
</subject_list>

Второй вариант:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<subject_list>
  <subject>
    <tag1>...</tag1>
    <tag2>...</tag2>
    <tag3>...</tag3>
    ...
  </subject>
  ...
  <subject>
    <tag1>...</tag1>
    <tag2>...</tag2>
    <tag3>...</tag3>
    ...
  </subject>
</subject_list>

- тоесть без вложенных элементов.

На выходе необходимо получить:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<ROWDATA>
   <ROW
   tag1="..." 
   tag2="..."
   tag3="..."
   ...>
      <tagN_list>
         <rowtagN_list subtag1="..." subtag2="..." subtag3="..."/>
         <rowtagN_list subtag1="..." subtag2="..." subtag3="..."/>
         ....
      </tagN_list>
   </ROW>
   ...
</ROWDATA>

или, как минимум:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<ROWDATA>
   <ROW
   tag1="..." 
   tag2="..."
   tag3="..."
   ...>
      <tagN_list>
      </tagN_list>
   </ROW>
   ...
</ROWDATA>

использую вот такое преобразование:
Код: plaintext
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.
	<xsl:template match="subject_list">
        <DATAPACKET Version="2.0">
            <METADATA>
			    <FIELDS>
			        <FIELD attrname="tag1" fieldtype="datetime"/>
			        <FIELD attrname="tag2" fieldtype="string" WIDTH="50"/>
					<FIELD attrname="tag3" fieldtype="string" WIDTH="50"/>
					...
			        <FIELD attrname="tagN_list" fieldtype="nested">
			            <FIELDS>
			                <FIELD attrname="subtag1" fieldtype="i4"/>
			                <FIELD attrname="subtag2" fieldtype="date"/>
			                <FIELD attrname="subtag3" fieldtype="r8"/>
			            </FIELDS>
			            <PARAMS/>
			        </FIELD>
				</FIELDS>
				<PARAMS/>
			</METADATA>
            <ROWDATA>
              <xsl:apply-templates select="subject"/>
            </ROWDATA>
        </DATAPACKET>
    </xsl:template>
	
    <xsl:template match="subject">
        <ROW tag1="{...}" tag2="{...}" tag3="{...}"> 
			<xsl:apply-templates select="tagN_list"/>
        </ROW>
    </xsl:template>
	
    <xsl:template match="tagN_list">
        <tagN_list>
            <xsl:apply-templates select="tagN"/>
        </tagN_list>
    </xsl:template>
	
    <xsl:template match="tagN">
		<rowtagN_list subtag="{...}" subtag="{...}" subtag="{...}">
        </rowtagN_list>
    </xsl:template>

Соответственно, при отсутствии во входном XML-файле контейнера
Код: plaintext
<tagN_list></tagN_list>
получается ошибка.
Как обходить её?
Каким образом производить простую передачу, при отсутствии во входном XML-файле, в выходной датапакет пустого контейнера
Код: plaintext
1.
      <tagN_list>
      </tagN_list>
...
Рейтинг: 0 / 0
01.02.2011, 08:05
    #37089696
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по xslt
Это те не хватает?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<xsl:choose>
  <xsl:when test="tagN_list">
    <xsl:apply-templates select="tagN_list"/>
  </xsl:when>
  <xsl:otherwise>
    <tagN_list/>
  </xsl:otherwise>
</xsl:choose>
...
Рейтинг: 0 / 0
01.02.2011, 11:28
    #37090103
PavelDart
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по xslt
refreg,
благодарю действительно работающее решение.
_Vasilisk_,Вам тоже спасибо за вариант, за Ваше внимание.
Последний вопрос -
пустой контейнер
Код: plaintext
1.
<tag_list>
</tag_list>

автоматически при трансформации преводится к
Код: plaintext
<tag_list/>

?
...
Рейтинг: 0 / 0
01.02.2011, 11:37
    #37090135
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по xslt
PavelDartпустой контейнер
Код: plaintext
1.
<tag_list>
</tag_list>

автоматически при трансформации преводится к
Код: plaintext
<tag_list/>

?Вообще, это от процессора зависит. Но скорее, сведется к одному закрытому тегу. Если очень надо, что бы было два тега, попробуй так:
Код: plaintext
1.
2.
<tagN_list>
   <xsl:text> </xsl:text>
</tagN_list>
...
Рейтинг: 0 / 0
01.02.2011, 13:20
    #37090516
PavelDart
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по xslt
refreg,
Ну да, так и есть. Я же решил применить пустой темплейт.
Ещё раз спасибо.
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / вопрос по xslt / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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