2017-02-11 12 views
0

У меня проблема с доступом к переменной в XSLT.
Я просто определить вар так:с использованием переменной Xsl

<xsl:variable name="myName" select="@owner"/> 

Когда я использую этот код не работает:

<title>{$myName}</title> 

, но с этим кодом работает:

<title><xsl:value-of select="$myName"/></title> 

Я хочу, чтобы сравнить переменная выше с каждым от объект в XML при значении от сущности равен Myname отобразить некоторый код в противном случае другого дисплей кода

<xsl:for-each select="message"> 
    <xsl:choose> 
     <xsl:when test="from = $myName"> 
      ... 
     </xsl:when> 
     <xsl:otherwise> 
      ... 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:for-each> 

XML-файл содержит следующую информацию:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="history.xsl"?> 
<history xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="history.xsd" owner="Mike"> 

<message> 
    <from>Mike</from> 
    <to>Gem</to> 
    <date>2002-09-24</date> 
    <color>red</color> 
    <size>20</size> 
    <family>cursive</family> 
    <style>overline</style> 
    <body>welcome</body> 
</message> 
</history> 
+1

Вам необходимо предоставить соответствующий вход XML и нужный вывод XML, чтобы мы могли лучше тренировки проблемы. Похоже, вы хотите 'test =" @ from = $ myName "' (mind the "@") – programaths

+0

Где атрибут «владелец», на который вы ссылаетесь в переменной? – programaths

+0

Вы пытаетесь это сделать: http://xsltransform.net/bwdwsD? – programaths

ответ

0

Вот XSLT:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 
    <xsl:variable name="myName" select="/history/@owner"/> 

    <xsl:template match="/"> 

     <xsl:apply-templates/> 

    </xsl:template> 

    <xsl:template match="message"> 
     <xsl:choose> 
     <xsl:when test="from = $myName"> 
      Mike message 
     </xsl:when> 
     <xsl:otherwise> 
      Other message 
     </xsl:otherwise> 
    </xsl:choose>   
    </xsl:template> 
</xsl:transform> 

It вытащит значение в начале выполнения и поместит его в переменную «myName».

Затем я сопоставляю имя тега (сообщение) и использую XSL, как вы это делали.

Вы также можете избежать использования XSL: выбрать поступая так:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 
    <xsl:variable name="myName" select="/history/@owner"/> 

    <xsl:template match="/"> 

     <xsl:apply-templates/> 

    </xsl:template> 

    <xsl:template match="message[from=$myName]">   
      Mike message     
    </xsl:template> 

    <xsl:template match="message">   
      Other message     
    </xsl:template> 
</xsl:transform> 

Это показывает вам что-то важное: XSL выбрать первый шаблон соответствия!

Второй вариант лучше подходит для модульности. Первый подразумевает вложение. Этот второй не надо!

Тест как онлайн: