чего то не врубаюсь как составить XPath выражение

slach

Новичок
чего то не врубаюсь как составить XPath выражение

имею две переменных
<xsl:variable name="top_bg_color">
<bg_color href="geology/">#EFA300</bg_color>
<bg_color href="forest/">#41C215</bg_color>
<bg_color href="water/">#249AED</bg_color>
<bg_color href="ecology/">#743BE9</bg_color>
<bg_color href="statecontrol/">#ED5324</bg_color>
</xsl:variable>
и соответсвенно

<xsl:variable name="url">geology/news</xsl:variable>

хочу через XPath выбрать тот bg_color который содержится в $url

<xsl:variable name="color" select="$top_bg_color/bg_color[contains(@href,$url)]" />

не катит, потому что contains возвращает true или false

пока что обхожусь вот такой конструкцией

<xsl:for-each select="$top_bg_color/bg_color">
<xsl:if test="contains(@href,$url)">
<td width="413" bgcolor="."><img src="i/x.gif" width="413" height="1" alt="" /></td>
</xsl:if>
</xsl:for-each>

Но она громоздкая какая то как мне кажется...
может есть пути по элегантнее ?
 

Леонов Василий

Guest
Re: чего то не врубаюсь как составить XPath выражение

Автор оригинала: slach

<xsl:variable name="color" select="$top_bg_color/bg_color[contains(@href,$url)]" />
не понял при чём здесь Xpath, но в нём это будет так:
(строка запроса )=
PHP:
$top_bg_color.'/bg_color[contains(@href,"' .$url. '")]/text()'
 

Sababa

Guest
PHP:
<xsl:variable name="bgcolor.url" select="$top_bg_color/bg_color[contains(@href,$url)][1]"/>

<xsl:variable name="bgcolor">
	<xsl:choose>
		<xsl:when test="count($bgcolor.url) &gt; 0">
			<xsl:value-of select="$bgcolor.url/text()"/>
		</xsl:when>
		<xsl:otherwise>
			<xsl:value-of select="$bgcolor.default"/>
		</xsl:otherwise>
	</xsl:choose>
</xsl:variable>
 

slach

Новичок
$top_bg_color/bg_color[contains(@href,$url)][1]
choose лишнее...

странно =))) мне почему то не пришло такое в голову...

cпасибо =)
 

Sababa

Guest
To slash:

На самом деле ты не прав, в квадратных скобках это предикаты, предикатов может быть один или несколько, предикат это выражение, которое вычисляется относительно выбранного узла и если результат истина, то узел остается в фильтруемом множестве.

Результат вычисления предиката преобразуется в булевый тип.

если результат равен числу, то это равносильно предикату [position()=число]

Почти цитата из Алексея Валикова.

так вот выражение:
bg_color[contains(@href,$url)][1]

выбирает только первый bg_color аттрибут @href которого содержит $url
 

slach

Новичок
да понял уже...
блин... пить надо меньше... надо больше спать =(
 
Сверху