Comment remplacer un nœud-nom avec un autre dans Xslt?
Mauvaise formulation de la question, désolé. Vais essayer d'expliquer ce que je suis en train de faire.
Fondamentalement, j'ai la sortie à partir d'une recherche, Xml et Xml il existe un nœud comme celui-ci:
<FIELD NAME="body">
Somebody named
<key>Doris</key>
and
<key>Arnie</key>
</FIELD>
En bref, ce que j'ai besoin est de remplacer "<key>" par "<strong>"; c'est à dire. mettre en évidence les résultats de recherche (la clé des valeurs de nœud sont ce que l'utilisateur recherché). Dans le Xslt je ne sais pas ce que l'utilisateur a consulté à partir de, autres que l'interrogation Xml -> CHAMP[@name='corps']/touche.
Droit maintenant, j'ai quelques fous code qui va extraire tout ce qui est en face de la durée de recherche ("Doris"), mais qui ony fonctionne pour 1 terme de recherche. Nous en avons besoin pour ce faire de plusieurs termes. Le code que nous utilisons ressemble à ceci:
<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>
Ce que j'ai essayé de faire est d'appeler ce code plusieurs fois avec les différents termes de recherche, mais je suis struggeling sur la façon d'utiliser la sortie de l'appel pour le modèle d'entrée pour le prochain appel. Dans le code, il serait quelque chose comme ceci:
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);
}
Jusqu'à présent j'ai été incapable de faire quelque chose comme cela dans XSLT, mais je suis encore un noob, donc... 😉
Edit: Juste pour clarifier la sortie, je suis à la recherche d'est: est-ce
Somebody named <strong>Doris</strong> and <strong>Arnie</strong>
OriginalL'auteur noocyte | 2009-12-18
Vous devez vous connecter pour publier un commentaire.
La meilleure chose à faire dans de telles situations est récursive de copier des nœuds à partir de l'entrée à la sortie et de remplacer les nœuds que vous souhaitez traiter différemment. L'idée clé est que les chaînes de texte sont des nœuds qui peuvent être copiés. Voici un exemple:
Essayez de ne sélectionner qu'CHAMP[@NAME='corps'] ou même CHAMP ou /
Vous êtes une légende! 🙂 Mais il y a une faute de frappe dans votre Xslt; apply-templates ne permet pas de "match"; je crois qu'il devrait être "sélectionner". Et cela a fonctionné quand j'ai utilisé du "CHAMP[NOM='corps']". 🙂 Thnx!!
Désolé. J'ai corrigé la faute de frappe maintenant.
Vous êtes les bienvenus. Voir aussi mes autres explications dans les commentaires de Chris' version.
OriginalL'auteur Rich
Ceci devrait faire ce dont vous avez besoin. Il utilise le modèle appliquer au lieu d'appeler des modèles et est plus fonctionnelle à s'attaquer à ce problème.
Le deuxième modèle correspond à tous les nœuds dans le document et produit tout simplement une copie. Le premier modèle correspond à votre DOMAINE spécifique/clé que vous recherchez et le remplace par <strong>. Ce modèle est couramment utilisé à la sortie de document XML être une copie de l'original.
Je suis désolé, mais je ne comprenais pas ce dernier commentaire... je veux dire, je peux comprendre les mots, mais il ne fait aucun sens pour moi... (je suis un noob, s'il vous plaît garder avec moi)
Lorsque vous appliquez des modèles à un nœud ou un attribut, le processeur XSLT va chercher le plus spécifique de la chose qui correspond. Dans tous les cas, sauf lorsque le traitement de la clé correspond le mieux sera le deuxième modèle, qui vient de codes le nœud courant à la sortie et puis, de manière récursive s'applique modèles pour l'ensemble de ses nœuds enfants ou les attributs. Si il n'y avait pas toutes les clés à l'intérieur des champs avec name="corps", alors il serait juste de copier l'intégralité d'un document d'entrée à la sortie. Toutefois, lorsque le processeur rencontre la clé, il crée une nouvelle "forte" élément de la sortie et se déplace ensuite sur la clé...
...les enfants, les rajouter à la sortie de trop. Le résultat net est que toutes les "clés" des éléments dans l'entrée sont convertis à "fort" des éléments dans la sortie et tout le reste est laissé inchangé (y compris les nœuds de texte).
OriginalL'auteur Chris Dail
Pourquoi ne pouvez-vous pas tout simplement remplacer la "CLÉ" de l'élément "bon" éléments? Mieux de ne pas penser trop impérativement à ce sujet.
Ou ai-je mal vous comprendre?
Juste pour clarifier la sortie, je suis à la recherche d'est: est-ce que Quelqu'un nommé <strong>Doris</strong> et <strong>Arnie</strong>
Le modèle doit correspondre à de toute façon, sauf si vous avez changé le modèle par défaut de comportement: la feuille de style doit répéter le fichier XML, jusqu'à ce qu'il trouve le nœud. Est-ce que votre fichier XML ont des espaces de noms? Avez-vous lier les espaces de noms correctement dans votre feuille de style?
Pas d'espaces de noms dans le fichier Xml.
OriginalL'auteur xcut