Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > copy-of элемента с переменной внутри


Автор: KSURi 29.7.2010, 18:08
Внутри XSL документа вставлены данные:
Код

<self:data>
  <item>
    <a href="{$htdocs}/foo">foo</a>
  </item>
  <item>
    <a href="{$htdocs}/bar">bar</a>
  </item>
</self:data>


Потом эти данные надо вывести в темплейте:
Код

<xsl:for-each select="document('')/xsl:stylesheet/self:data/item">
  <xsl:copy-of select="a"/>
</xsl:for-each>


Проблема в том, что переменная $htdocs не интерполируется, а так и вставляется в ссылку плейн-текстом. Мне, естественно, это не подходит. Как добиться нужного эффекта?

Автор: magelan 5.8.2010, 15:40
По хорошему, по XML надо сначала пробежаться приблудой, которая заменит все эти {} на то, что надо.

На XSL это делается как-то так, хотя не очень понятно, откуда XSL узнает про $htdocs.

Код

<xsl:for-each select="document('')/xsl:stylesheet/self:data/item">
  <xsl:apply-templates select="a"/>
</xsl:for-each>

<xsl:template match="A|a">
   <xsl:copy>
       <xsl:copy-of select="@*[name() != 'href' and name() != 'HREF' ]"/>
       <xsl:attribute name="href">
           <xsl:choose>
                <xsl:when test="contains(@href, '{')">
                      <xsl:value-of select="substring-before(@href, '{' )" />
                      <xsl:call-template name="lexer">
                           <xsl:with-param name="lexem" select="substring-before(substring-after(@href, '{' ), '}' )" />
                      </xsl:call-template>
                      <xsl:value-of select="substring-after(@href, '}' )" />
                <xsl:when>
                <xsl:otherwise>
                      <xsl:value-of select="@href"/>
                <xsl:otherwise>
           </xsl:choose>
       </xsl:atribute>
       <xsl:value-of select="." />
   </xsl:copy>
</xsl:template>

<xsl:template name="lexer">
   <xsl:param name="lexem" />

   <xsl:if test="$lexem = '$htdocs'">
        <xsl:value-of select="'что-то'" />
   </xsl:if>
</xsl:template>

Автор: KSURi 9.8.2010, 13:01
Да нет же, $htdocs - это нормальная XSL переменная: 
Код

<xsl:variable name="htdocs" select="/some/path"/>

А 
Код

<a href="{$htdocs}">

это, соответственно, обычный способ подстановки переменных, который почему-то не работает внутри copy-of.

Автор: magelan 9.8.2010, 17:14
если проблема только с копи-оф, воспользуйтесь полной нотацией:

Код

<A>
  <xsl:attribute name="HREF">
     <xsl:value-of select="$htdocs"/>
  </xsl:attribute>
</A>


но мне почему-то кажется, что вы пишите XSL инструкцию в XML файле (не завернутую в xsl:stylesheet) и удивляетесь, почему она не работает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)