xslt присвоение значения переменной строковому литералу - PullRequest
0 голосов
/ 24 ноября 2011

у меня

<xsl:for-each select="ancestor-or-self::*">
  <xsl:variable name="expression" select="name()" ></xsl:variable>
</xsl:for-each>

ниже у меня есть href, и я хочу установить значение этой переменной выражения в href #######

<a href="/myplan?expression={$expression}" class="deleteIcon">Delete</a>

Я также пытался с:

  <a href="concat('/myplan?expression={',$expression)}" class="deleteIcon">Delete</a>

Никто из них не работал.

Кто-нибудь может мне помочь, как это сделать?

В основном моя задача состоит в том, чтобы найти выражение для текущего узла и отправить выражение для того же самого в href?

Добавление дополнительной информации:

<br/><xsl:for-each select="ancestor-or-self::*">
               <xsl:variable name="expression" select="name()" />
            </xsl:for-each>
        <b><a href="{concat('/admin/eapp/deleteQuestions?expression=',$expression)}"></a>Click Me</b>

когда преобразуется вышеуказанный xsl-код, выдается ошибка ниже:

 Variable or parameter 'expression' is undefined.

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

В XSLT1.0 вы могли бы попытаться установить переменную следующим образом:

  <xsl:variable name="expression">
     <xsl:for-each select="ancestor-or-self::*">
        <xsl:text>/</xsl:text>
        <xsl:variable name="name" select="name()"/>
        <xsl:value-of select="$name"/>
     </xsl:for-each>
  </xsl:variable>

Итак, предполагая следующую структуру XML

<As>
   <a>
      <Bs>
         <b>5</b>
      </Bs>
   </a>
   <a>
      <Bs>
         <b>9</b>
      </Bs>
   </a>
   <a/>
   <a>
      <Bs>
         <b>12</b>
         <b>14</b>
         <b>15</b>
      </Bs>
   </a>
</As>

Если вы располагались на b элемент со значением 14, тогда выражение будет установлено на / As / a / Bs / b

Однако это не займетучитывать несколько узлов с одним и тем же именем, и этого будет недостаточно, если вы хотите, чтобы точный XPath выбирал узел.

Вместо этого вы можете попробовать следующее:

  <xsl:variable name="expression">
     <xsl:for-each select="ancestor-or-self::*">
        <xsl:text>/</xsl:text>
        <xsl:variable name="name" select="name()"/>
        <xsl:value-of select="$name"/>
        <xsl:text>[</xsl:text>
        <xsl:value-of select="count(preceding-sibling::*[name() = $name]) + 1"/>
        <xsl:text>]</xsl:text>
     </xsl:for-each>
  </xsl:variable>

Это будетreturn / As [1] / a [4] / Bs [1] / b [2] , что может быть тем, что вы хотите.

0 голосов
/ 25 ноября 2011

Очень просто, переменные находятся в XSL и существуют только внутри содержащего тега.Таким образом, переменная с именем expression существует только в блоке for-each.Кроме того, переменные могут быть установлены только один раз.Попытка установить значение переменной во второй раз не имеет никакого эффекта.

Поэтому вы должны объявить переменную на уровне или выше уровня, на котором вы хотите ее использовать, и поместить весь код для генерации значения внутри переменной.декларация.Если вы можете использовать XSLT2, следующее будет делать то, что вы хотите:

string-join(for $n in ancestor-or-self::* return name($n), '/')

Я знаю, что это также может быть сделано в XSLT 1 с рекурсивным шаблоном, но у меня нет удобного примера.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...