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

Испытываю некоторые затруднения с 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
22.06.2010, 13:50
    #36700500
Andry Trushin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: как "закрыть" тег?
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
22.06.2010, 13:53
    #36700511
Andry Trushin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: как "закрыть" тег?
Знак больше в переменной сожрался... надо писать в коде &gt;

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

Вы маг и чародей )
Большое спасибо!
...
Рейтинг: 0 / 0
22.06.2010, 23:04
    #36701886
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: как "закрыть" тег?
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
23.06.2010, 10:07
    #36702325
RnR
RnR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: как "закрыть" тег?
_Vasilisk_,

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

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

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

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

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

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

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


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