Как использовать XSLT, чтобы поместить набор узлов в значение атрибута? - PullRequest
2 голосов
/ 16 ноября 2010

У меня есть шаблон xsl, который я хочу вызвать для добавления в атрибут узла HTML:

<xsl:variable name="onClickJavaScript">
  <xsl:call-template name="GetOnClickJavaScript" />
</xsl:variable>
<a id="123">
  <xsl:attribute name="onclick">
    <xsl:value-of select="$onClickJavaScript" />
  </xsl:attribute>
</a>

Моя проблема в том, что шаблон вызова возвращает набор узлов, а значение атрибута хочет быть строкой. Кажется, я не могу найти способ превратить набор узлов в строку, которая работает.

Я попытался изменить значение строки на:

<xsl:value-of select="$onClickJavaScript/text()" />

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

В отладчике Visual Studio я вижу, что $ onClickJavaScript - это NodeSet с одним измерением и элементом. Моя строка похоронена там, но недоступна: - (.

UPDATE ...

Когда я вызываю мой шаблон, он проходит через большой оператор case и вызывает другой шаблон. Этот другой шаблон имеет <xsl:choose>, и в этом случае он идет по следующему пути:

<xsl:when test="$isPrimary='true'">         
  <!-- Just provide the onclick event JavaScript -->
  <xsl:value-of select='concat($launchMethod, "(this, &apos;", $id, "&apos;, &apos;", $nodeid, "&apos;, &apos;", $instanceid, "&apos;)")' />
</xsl:when>

Ответы [ 3 ]

2 голосов
/ 16 ноября 2010

С предоставленной информацией ваш первый образец должен работать, т.е.

<xsl:attribute name="onclick">
  <xsl:value-of select="$onClickJavaScript" />
</xsl:attribute>

должен вставить атрибут onclick со значением (строка) $onClickJavaScript.

Вы даже можете упростить свой XSLT, используя шаблон значений атрибутов :

<a id="123" onclick="{$onClickJavaScript}">...</a>

Или избавиться от переменной и вызвать шаблон внутри узла атрибута:

<xsl:attribute name="onclick">
  <xsl:call-template name="GetOnClickJavaScript" />
</xsl:attribute>
1 голос
/ 17 ноября 2010

Я тоже не могу воспроизвести это ... вот что я попробовал, щелчок по a получает "foo (this, '3', 'test')". Чем еще отличается? Что такое фрагмент дерева результатов, который вы пытаетесь вызвать xsl: value-of on?

<xsl:template match="/">
  <xsl:variable name="onclick-val">
    <xsl:call-template name="foo" />
  </xsl:variable>
  <a>
    <xsl:attribute name="onclick">
      <xsl:value-of select="$onclick-val" />
    </xsl:attribute>
  </a>
</xsl:template>

<xsl:template name="foo">
  <xsl:choose>
    <xsl:when test="false()">
      false
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="callme" />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="callme">
  <xsl:choose>
    <xsl:when test="true()">
      <xsl:value-of select='concat("foo", "(this, &apos;", "3", "&apos;, &apos;", "test", "&apos;)")' />
    </xsl:when>
    <xsl:otherwise>
      false
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
1 голос
/ 16 ноября 2010

Моя проблема в том, что call-шаблон возвращает набор узлов и атрибут значение хочет быть строкой. Я не могу кажется, найти какой-либо способ преобразовать узел установлен в строку, которая работает.

Проблема в коде, который вы не показали .

На самом деле я вообще не могу воспроизвести эту проблему.

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
    <xsl:variable name="onClickJavaScript">
      <xsl:call-template name="GetOnClickJavaScript" />
    </xsl:variable>

   <xsl:variable name="onClickJavaScript2">
      <xsl:call-template name="GetOnClickJavaScript2" />
    </xsl:variable>

    <a id="123">
      <xsl:attribute name="onclick">
        <xsl:value-of select="$onClickJavaScript" />
      </xsl:attribute>
    </a>
    <a id="123456">
      <xsl:attribute name="onclick">
        <xsl:value-of select="$onClickJavaScript" />
      </xsl:attribute>
    </a>
 </xsl:template>

 <xsl:template name="GetOnClickJavaScript">Hello</xsl:template>

 <xsl:template name="GetOnClickJavaScript2">
  <a>Hello</a>
 </xsl:template>
</xsl:stylesheet>

при применении к любому документу XML (не используется) выдает результаты без ошибок :

<a id="123" onclick="Hello"/>
<a id="123456" onclick="Hello"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...