Плохая формулировка вопроса, извините за это. Постараюсь объяснить, что я пытаюсь сделать.
По сути, у меня есть результат поиска в виде Xml, и в этом Xml есть такой узел:
<FIELD NAME="body">
Somebody named
<key>Doris</key>
and
<key>Arnie</key>
</FIELD>
Короче говоря, мне нужно заменить "" на ""; то есть. выделите результаты поиска (ключевые значения узла - это то, что пользователь искал). В Xslt я не знаю, что искал пользователь, кроме запроса Xml-> FIELD [@ name = 'body'] / key.
Прямо сейчас у меня есть какой-то сумасшедший код, который будет извлекать все, что находится перед поисковым термином («Дорис»), но он работает только для одного поискового запроса. Нам нужно это сделать для нескольких терминов. Код, который мы используем, выглядит следующим образом:
<xsl:template name="highlighter">
<xsl:param name="text"/>
<xsl:param name="what"/>
<xsl:choose>
<xsl:when test="contains($text, $what) and string-length($what) > 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>