Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / как получить значение атрибута через переменную в цикле? / 7 сообщений из 7, страница 1 из 1
05.05.2008, 15:24
    #35294638
wicont
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как получить значение атрибута через переменную в цикле?
Уважаемые знатоки XSL!! Помогите кто чем может

есть переменная:
<xsl:variable name="atr_stages">
<stage name="border"/> <stage name="align"/> <stage name="color"/> <stage name="align"/>
</xsl:variable>

есть нода: <xsl:variable name="tag_node" select ="."/>

иду по переменной в цикле и смотрю есть ли в моем xml-документе данный атрибут и если есть - беру его значение

<xsl:for-each select="($atr_stages)/stage">
<xsl:variable name="atr_name" select ="@name"/>
<xsl:if test="$tag_node/@??? != ''">
<xsl:attribute name="{$atr_name}">
<xsl:value-of select="$tag_node/@???"/>
</xsl:attribute>
</xsl:if>
</xsl:for-each>

что ставить вместо '???' ?

допусим если поставить не переменную, а 'border' (будем обращаться к $tag_node/@border ) - то работает, но это частный случай, а мне нужно в цикле пройти по всем атрибутам

PS Буду очень признателен за любую помощь
...
Рейтинг: 0 / 0
05.05.2008, 16:04
    #35294798
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как получить значение атрибута через переменную в цикле?
Вот тебе шаблон, который выводит все атрибуты
Код: plaintext
1.
2.
3.
  <xsl:template match="@*" mode="attr">
    <xsl:value-of select="concat('name - ', name(), ' value - ', .)"/>
  </xsl:template>
использовать так
Код: plaintext
<xsl:apply-templates select="@*" mode="attr"/>
...
Рейтинг: 0 / 0
05.05.2008, 16:53
    #35295001
wicont
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как получить значение атрибута через переменную в цикле?
эээ..
но мне не нужны все атрибуты (!) мне нужны значения только тех атрибутов, которые есть в моей
переменной/массиве <xsl:variable name="atr_stages"> , см. выше
...
Рейтинг: 0 / 0
05.05.2008, 17:08
    #35295050
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как получить значение атрибута через переменную в цикле?
Так и говори
Код: plaintext
<xsl:value-of select="$tag_node/@*[name() = $attr_name]"/>

С уважением, Vasilisk
...
Рейтинг: 0 / 0
05.05.2008, 17:21
    #35295096
wicont
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как получить значение атрибута через переменную в цикле?
еще раз. Для одного атрибута все довольно просто:
Код: plaintext
1.
2.
3.
4.
5.
6.
....
<xsl:if test="@border != ''">
   <xsl:attribute name="border">
      <xsl:value-of select="@border"/>
   </xsl:attribute>
</xsl:if>
.....

но у меня их может быть штук 40 !! Нужно это сделать в цикле

Код: plaintext
1.
2.
3.
4.
5.
6.
<xsl:for-each select="($atr_stages)/stage">
   <xsl:if test="@(?) != ''">
       <xsl:attribute name="{$atr_stages/stage/@name}">
	<xsl:value-of select="@(?)"/>
       </xsl:attribute>
   </xsl:if>
</xsl:for-each> 

т.е. нужно узнать не пустое ли значение моего i-того атрибута - и если не пустое, - то записать и сам атрибут и его значение. В качестве имени атрибута - берем переменную цикла "{$atr_stages/stage/@name}". А вот как обратиться к значению??
...
Рейтинг: 0 / 0
05.05.2008, 17:36
    #35295161
wicont
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как получить значение атрибута через переменную в цикле?
[quot _Vasilisk_]Так и говори
Код: plaintext
<xsl:value-of select="$tag_node/@*[name() = $attr_name]"/>

вот это то что нужно было !!!

Vasilisk, огромное тебе человеческое СПАСИБО :)) !!
...
Рейтинг: 0 / 0
05.05.2008, 17:57
    #35295237
как получить значение атрибута через переменную в цикле?
к XML
Код: plaintext
1.
2.
3.
4.
5.
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="test_xsl.xsl"?>
<name border="1" notpresent="2" align="3">
	<last>lastname</last>
	<first>firstname</first>
</name>
применяем
Код: 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"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="xml" indent="yes"/>
	<xsl:template match="name">
		<attributes>
			<xsl:variable name="atr_stages">
				<stage name="border"/>
				<stage name="align"/>
				<stage name="color"/>
				<stage name="align"/>
			</xsl:variable>
			<xsl:variable name="tag_node" select="."/>
			<xsl:for-each select="($atr_stages)/stage">
				<xsl:variable name="atr_name" select="@name"/>
				<xsl:if test="$tag_node/@*[name()=$atr_name]">
					<xsl:element name="{$atr_name}">
						<xsl:value-of select="$tag_node/@*[name()=$atr_name]"/>
					</xsl:element>
				</xsl:if>
			</xsl:for-each>
		</attributes>
	</xsl:template>
</xsl:stylesheet>
получаем
Код: plaintext
1.
2.
3.
4.
5.
<?xml version="1.0" encoding="UTF-8"?>
<attributes>
	<border> 1 </border>
	<align> 3 </align>
	<align> 3 </align>
</attributes>
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / как получить значение атрибута через переменную в цикле? / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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