powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT: как "закрыть" тег?
10 сообщений из 10, страница 1 из 1
XSLT: как "закрыть" тег?
    #36699835
RnR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, коллеги.

Испытываю некоторые затруднения с XSLT:

Написал такой XML-фрагмент:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="ex01-1.xsl"?>
<Customer>
	<NAME>Vasya</NAME>
	<EMAIL>asd@asd.asd<;/EMAIL>
	<PHONE>( 000 ) 000 - 0000 </PHONE>
	<DESCRIPTION>String</DESCRIPTION>
	<ADDRESS>
		<CITY>text</CITY>
		<STREET>text2</STREET>
		<PHONE>text3</PHONE>
	</ADDRESS>
	<ADDRESS>
		<CITY>text</CITY>
		<STREET>text2</STREET>
		<PHONE>text3</PHONE>
	</ADDRESS>
	<ADDRESS>
		<CITY>text</CITY>
		<STREET>text2</STREET>
		<PHONE>text3</PHONE>
	</ADDRESS>
</Customer>

и к нему такой XSL:

Код: plaintext
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:template match="/">
		<TABLE border="1">
			<TR>
				<TH>name</TH>
				<TH>value</TH>
			</TR>
			<xsl:apply-templates select="//*"/>
		</TABLE>
	</xsl:template>
	<xsl:template match="*">
		<TR>
			<TD>
				<xsl:value-of select="name()"/>
			</TD>
			<TD>
				<xsl:value-of select="."/>
			</TD>
		</TR>
	</xsl:template>
</xsl:stylesheet>

В результате получается вот такой вывод:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
name value 
Customer Vasya asd@asd.asd ( 000 ) 000 - 0000  String text text2 text3 text text2 text3 text text2 text3  
NAME Vasya 
EMAIL asd@asd.asd 
PHONE ( 000 ) 000 - 0000  
DESCRIPTION String 
ADDRESS text text2 text3  
CITY text 
STREET text2 
PHONE text3 
ADDRESS text text2 text3  
CITY text 
STREET text2 
PHONE text3 
ADDRESS text text2 text3  
CITY text 
STREET text2 
PHONE text3 

А нужен вот такой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
name value 
+Customer 
NAME Vasya 
EMAIL asd@asd.asd 
PHONE ( 000 ) 000 - 0000  
DESCRIPTION String 
+ADDRESS
CITY text 
STREET text2 
PHONE text3 
-ADDRESS
+ADDRESS
CITY text 
STREET text2 
PHONE text3 
-ADDRESS
+ADDRESS
CITY text 
STREET text2 
PHONE text3 
-ADDRESS
-Customer 

Подскажите пожалуйста, как добиться, чтобы у тегов CUSTOMER и ADDRESS (являющихся "родительскими" тегами, а не конечными "потомками") поле VALUE содержало NULL, а также как "закрывать" теги? Заранее спасибо.
...
Рейтинг: 0 / 0
XSLT: как "закрыть" тег?
    #36700500
Andry Trushin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RnR,

оно?

Код: 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.
42.
43.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:template match="/">
		<TABLE border="1">
			<TR>
				<TH>name</TH>
				<TH>value</TH>
			</TR>
			<xsl:apply-templates select="*" />
		</TABLE>
	</xsl:template>
	<xsl:template match="node()">
        <xsl:variable name="has_tag" select="count( * ) > 0" />
		<TR>
			<TD>
                <xsl:if test="$has_tag">
                    <xsl:text>+</xsl:text>
                </xsl:if>
				<xsl:value-of select="name()"/>
			</TD>
			<TD>
                <xsl:choose>
                    <xsl:when test="text()">
        				<xsl:value-of select="text()"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <BR/>
                    </xsl:otherwise>
                </xsl:choose>
			</TD>
		</TR>
        <xsl:if test="$has_tag">
            <xsl:apply-templates />
    		<TR>
    			<TD>
    				-<xsl:value-of select="name()"/>
    			</TD>
    			<TD>
    				<BR/>
    			</TD>
    		</TR>
        </xsl:if>
	</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
XSLT: как "закрыть" тег?
    #36700511
Andry Trushin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Знак больше в переменной сожрался... надо писать в коде &gt;

сорри за форматирование.
...
Рейтинг: 0 / 0
XSLT: как "закрыть" тег?
    #36700617
RnR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andry Trushin,

Вы маг и чародей )
Большое спасибо!
...
Рейтинг: 0 / 0
XSLT: как "закрыть" тег?
    #36701886
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andry Trushinоно?
Фи как неэстетично
Код: 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.
42.
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:template match="/">
		<TABLE border="1">
			<TR>
				<TH>name</TH>
				<TH>value</TH>
			</TR>
			<xsl:apply-templates select="*"/>
		</TABLE>
	</xsl:template>

	<xsl:template match="*[*]">
		<TR>
			<TD>
				+
			</TD>
			<TD>
				<xsl:value-of select="name()"/>
			</TD>
		</TR>
		<xsl:apply-templates select="*"/>
		<TR>
			<TD>
				-
			</TD>
			<TD>
				<xsl:value-of select="name()"/>
			</TD>
		</TR>
	</xsl:template>

	<xsl:template match="*">
		<TR>
			<TD>
				<xsl:value-of select="name()"/>
			</TD>
			<TD>
				<xsl:value-of select="."/>
			</TD>
		</TR>
	</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
XSLT: как "закрыть" тег?
    #36702325
RnR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Большое спасибо, буду изучать.
...
Рейтинг: 0 / 0
XSLT: как "закрыть" тег?
    #36703224
Andry Trushin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

авторФи как неэстетично
ничего личного, будем проверять чей код работает быстрее?
...
Рейтинг: 0 / 0
XSLT: как "закрыть" тег?
    #36704507
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andry Trushinничего личного
Аналогично
Andry Trushinбудем проверять чей код работает быстрее?
Можно и проверить, но на мой взгляд пока строка
Код: plaintext
<xsl:variable name="has_tag" select="count( * ) > 0" />
не будет заменена строкой
Код: plaintext
<xsl:variable name="has_tag" select="*" />
Ваш код будет значительно проигрывать в скорости
...
Рейтинг: 0 / 0
XSLT: как "закрыть" тег?
    #36705444
Andry Trushin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Вероятно каунт проиграет в скорости, но на приведенном выше дереве это не будет заметно, вот если бы вложенность была по 100 тегов, тогда да.

Впрочем чего бы я не написал, *[*] - безумно дорогая операция, учитывая то, что трансформеру на каждом вызове еще приходится разбираться между двумя темплейтами.
...
Рейтинг: 0 / 0
XSLT: как "закрыть" тег?
    #36705631
Andry Trushin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя, все фломастеры разные, каждый пишет так, как ему удобнее.

я объясню, почему я пишу так:
<xsl:variable name="has_tag" select="count( * ) > 0" />
а не иначе.

я разрабытываю проекты, которые зачастую подерживают люди обладая другой квалификацией, чем понятнее для программиста код, который написан, тем меньше ко мне потом будет вопросов.

поэтому я стараюсь обрабатывать одну сущность одним темплейтом и короткие xpath проверки писать в полном синтаксисе, что естественно коробит блюстителей стиля.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT: как "закрыть" тег?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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