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

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

Вот как написать обработку в xslt отсутствующего тэга во входном XML , и добиться необходимого результата?
...
Рейтинг: 0 / 0
вопрос по xslt
    #37089232
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
<tag_list>
  <xsl:apply-templates select="tag"/>
</tag_list>
...
Рейтинг: 0 / 0
вопрос по xslt
    #37089250
PavelDart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_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
вопрос по xslt
    #37089265
PavelDart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если не совсем понятно поясню:
При наличии тэга во входном 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
вопрос по xslt
    #37089399
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavelDartпрактически так и делаю:А Вы сделайте в точности так, а не "практически"
...
Рейтинг: 0 / 0
вопрос по xslt
    #37089428
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavelDart
Код: plaintext
1.
2.
...
<xsl:template match="tag_list">
...
Получается, при попытке прочитать информацию из узла <tag_list> во время xslt и возникает ошибка.А разве во входном XML есть элемент tag_list ?
...
Рейтинг: 0 / 0
вопрос по xslt
    #37089459
PavelDart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_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
вопрос по xslt
    #37089462
PavelDart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refregPavelDart
Код: plaintext
1.
2.
...
<xsl:template match="tag_list">
...
Получается, при попытке прочитать информацию из узла <tag_list> во время xslt и возникает ошибка.А разве во входном XML есть элемент tag_list ?
Уже путаться начал в показаниях :)
Давайте ориентироваться по последнему посту.
...
Рейтинг: 0 / 0
вопрос по xslt
    #37089474
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavelDartУже путаться начал в показаниях :)
Давайте ориентироваться по последнему посту.Тогда опиши еще раз XML к последнему посту. Что бы там tag_list были.
...
Рейтинг: 0 / 0
вопрос по xslt
    #37089525
PavelDart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Входящий 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
вопрос по xslt
    #37089696
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это те не хватает?
Код: 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
вопрос по xslt
    #37090103
PavelDart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refreg,
благодарю действительно работающее решение.
_Vasilisk_,Вам тоже спасибо за вариант, за Ваше внимание.
Последний вопрос -
пустой контейнер
Код: plaintext
1.
<tag_list>
</tag_list>

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

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

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

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


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