2010-05-06 5 views
4

Как я могу вставить параметр youtubeId в следующем коде:XSLT: вставить значение параметра внутри HTML-атрибут

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]> 
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxml="urn:schemas-microsoft-com:xslt" 
       xmlns:YouTube="urn:YouTube" 
    xmlns:umbraco.library="urn:umbraco.library" 
    exclude-result-prefixes="msxml umbraco.library YouTube"> 


<xsl:output method="xml" omit-xml-declaration="yes"/> 

<xsl:param name="videoId"/> 
<xsl:template match="/"> 
<a href="{$videoId}">{$videoId}</a> 

<object width="425" height="355"> 
<param name="movie" value="http://www.youtube.com/v/{$videoId}&amp;hl=en"></param> 
<param name="wmode" value="transparent"></param> 
<embed src="http://www.youtube.com/v/{$videoId}&amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed> 
</object>$videoId {$videoId} {$videoId} 
<xsl:value-of select="/macro/videoId" /> 
</xsl:template> 

</xsl:stylesheet> 

<xsl:value-of select="/macro/videoId" /> фактически выводит VideoID но все остальные вхождения не делают.

Я создаю макрос в CMS Umbraco. Параметр правильно передается в XSLT (потому что фактически выводит его значение). Как вставить это значение в атрибут src?

+0

Как ваш входной документ выглядит? Какую среду/код/​​инструмент вы используете для вызова своего XSLT? Является ли 'videoId' внешним параметром или содержится в вашем исходном XML-документе? –

+0

Я создаю макрос в CMS Umbraco. Параметр правильно передается в XSLT (потому что фактически выводит свое значение). Я просто хочу вставить значение в атрибут src. Мне вообще не нравится, как я это делаю. Любое обходное решение оценили. – usr

+1

Хороший вопрос (+1). См. Мой ответ для полного решения. :) –

ответ

19
<a href="{$videoId}">{$videoId}</a> 

Вы должны использовать <xsl:value-of select="$videoId"/> здесь:

<a href="{$videoId}"><xsl:value-of select="$videoId"/></a> 

Всякий раз, когда вы используете АВТ ({$videoId}) внутри значения атрибута, это должно работать, за исключением любого select атрибута.

В последнем случае вы можете использовать:

<xsl:value-of select="/macro/*[name()=$videoId]" /> 

Когда все это находит отражение в вашей трансформации, он работает во всех случаях:

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]> 
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxml="urn:schemas-microsoft-com:xslt" 
       xmlns:YouTube="urn:YouTube" 
    xmlns:umbraco.library="urn:umbraco.library" 
    exclude-result-prefixes="msxml umbraco.library YouTube"> 


<xsl:output method="xml" omit-xml-declaration="yes"/> 

<xsl:param name="videoId" select="'XXX'"/> 
<xsl:template match="/"> 
<a href="{$videoId}"><xsl:value-of select="$videoId"/></a> 

<object width="425" height="355"> 
<param name="movie" value="http://www.youtube.com/v/{$videoId}&amp;hl=en"></param> 
<param name="wmode" value="transparent"></param> 
<embed src="http://www.youtube.com/v/{$videoId}&amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed> 
</object><xsl:value-of select="concat($videoId, ' ', $videoId, ' ', $videoId)"/> 
<xsl:value-of select="/macro/*[name()=$videoId]" /> 
</xsl:template> 

</xsl:stylesheet> 
+1

Хороший ответ (как всегда), а AVT - это термин для * шаблона значения атрибута *, см. Http://www.w3.org/TR/xslt#attribute-value-templates (только для уточнения ;-) –

+0

Ваше решение заставил меня понять, что параметр videoId получает * не *, установленный umbraco. Я изменил его следующим образом: usr

Смежные вопросы