Как заменить имя узла другим в Xslt?

Плохая формулировка вопроса, извините за это. Постараюсь объяснить, что я пытаюсь сделать. По сути, у меня есть результат поиска в виде Xml, и в этом Xml есть такой узел:

<FIELD NAME="body">
  Somebody named 
  <key>Doris</key> 
  and 
  <key>Arnie</key> 
</FIELD>

Короче говоря, мне нужно заменить «<key>» на «<strong>»; то есть. выделите результаты поиска (ключевые значения узла - это то, что пользователь искал). В Xslt я не знаю, что искал пользователь, кроме как запросить ключ Xml -> FIELD [@ name = 'body'] /.

Прямо сейчас у меня есть какой-то сумасшедший код, который будет извлекать все, что находится перед поисковым термином («Дорис»), но он работает только для одного поискового запроса. Нам нужно это сделать для нескольких терминов. Код, который мы используем, выглядит следующим образом:

  <xsl:template name="highlighter">
    <xsl:param name="text"/>
    <xsl:param name="what"/>

    <xsl:choose>
      <xsl:when test="contains($text, $what) and string-length($what) &gt; 0">
        <xsl:variable name="before" select="substring-before($text, $what)"/>
        <xsl:variable name="after" select="substring-after($text, $what)"/>
        <xsl:variable name="real-before" select="substring($text, 1, string-length($before))"/>
        <xsl:variable name="real-what" select="substring($text, string-length($before) + 1, string-length($what))"/>
        <xsl:variable name="real-after" select="substring($text, string-length($before) + string-length($what) + 1)"/>
        <xsl:value-of select="$real-before"/>

        <strong>
          <xsl:value-of select="$real-what"/>
        </strong>

        <xsl:call-template name="highlighter">
          <xsl:with-param name="text" select="$real-after"/>
          <xsl:with-param name="what" select="$what"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$text"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

То, что я пытался сделать, - это вызывать этот код несколько раз с разными поисковыми терминами, но я пытаюсь понять, как использовать выходные данные из вызова шаблона в качестве входных данных для следующего вызова. В коде это будет примерно так:

string body = doc.SelectSingleNode("FIELD[@NAME='body']");
NodeCollection nodes = doc.SelectNodes("FIELD[@NAME='body']/key");
foreach (var node in nodes) {
    body = hightlighter(body, node.InnerText);   
}

До сих пор я не мог сделать что-то подобное в XSLT, но я все еще нуб, так что ...;)

Изменить: просто чтобы уточнить; вывод, который я ищу, это:

Somebody named <strong>Doris</strong> and <strong>Arnie</strong>

Ответы на вопрос(3)

Ваш ответ на вопрос