Comment puis-je limiter le nombre de mots d'une chaîne dans XSLT 1.0?Comment limiter le nombre de mots de chaîne dans XSLT 1.0?
Répondre
Que diriez-vous quelque chose comme:
<xsl:template match="data"> <!-- your data element or whatever -->
<xsl:call-template name="firstWords">
<xsl:with-param name="value" select="."/>
<xsl:with-param name="count" select="4"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="firstWords">
<xsl:param name="value"/>
<xsl:param name="count"/>
<xsl:if test="number($count) >= 1">
<xsl:value-of select="concat(substring-before($value,' '),' ')"/>
</xsl:if>
<xsl:if test="number($count) > 1">
<xsl:variable name="remaining" select="substring-after($value,' ')"/>
<xsl:if test="string-length($remaining) > 0">
<xsl:call-template name="firstWords">
<xsl:with-param name="value" select="$remaining"/>
<xsl:with-param name="count" select="number($count)-1"/>
</xsl:call-template>
</xsl:if>
</xsl:if>
</xsl:template>
Ceci est une solution XSLT 1.0:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
>
<xsl:import href="strSplit-to-Words.xsl"/>
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:variable name="vwordNodes">
<xsl:call-template name="str-split-to-words">
<xsl:with-param name="pStr" select="/"/>
<xsl:with-param name="pDelimiters"
select="', 	 ()-'"/>
</xsl:call-template>
</xsl:variable>
<xsl:call-template name="strTakeWords">
<xsl:with-param name="pN" select="10"/>
<xsl:with-param name="pText" select="/*"/>
<xsl:with-param name="pWords"
select="ext:node-set($vwordNodes)/*"/>
</xsl:call-template>
</xsl:template>
<xsl:template match="word" priority="10">
<xsl:value-of select="concat(position(), ' ', ., ' ')"/>
</xsl:template>
<xsl:template name="strTakeWords">
<xsl:param name="pN" select="10"/>
<xsl:param name="pText"/>
<xsl:param name="pWords"/>
<xsl:param name="pResult"/>
<xsl:choose>
<xsl:when test="not($pN > 0)">
<xsl:value-of select="$pResult"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="vWord" select="$pWords[1]"/>
<xsl:variable name="vprecDelims" select=
"substring-before($pText,$pWords[1])"/>
<xsl:variable name="vnewText" select=
"concat($vprecDelims, $vWord)"/>
<xsl:call-template name="strTakeWords">
<xsl:with-param name="pN" select="$pN -1"/>
<xsl:with-param name="pText" select=
"substring-after($pText, $vnewText)"/>
<xsl:with-param name="pWords" select=
"$pWords[position() > 1]"/>
<xsl:with-param name="pResult" select=
"concat($pResult, $vnewText)"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
lorsque cette transformation est appliquée sur le document XML suivant:
<t>
(CNN) -- Behind closed doors in recent days,
senior White House aides have been saying that
measuring President Obama's first 100 days
is the journalistic equivalent of a Hallmark holiday.
</t>
le résultat recherché est retourné:
(CNN) -- Behind closed doors in recent days, senior White House
Prenez note:
Le
str-split-to-words
modèle deFXSLest l'utilisation d pour la segmentation.Ce modèle accepte un paramètre
pDelimiters
qui est une chaîne composée de tous les caractères devant être traités comme des délimiteurs. Ainsi, contrairement à d'autres solutions, il est possible de spécifier chaque délimiteur (et pas seulement un "espace") - dans ce cas 8 d'entre eux.Les appels modèle
strTakeWords
nommé lui-même récursive d'accumuler le texte avant et y compris tous les mots de la liste de mots produit par le tokenization, jusqu'à ce que le nombre spécifié de mots a été traitée.
Salut merci beaucoup pour vos réponses. Juste pour clarifier je ne peux pas lier aux extensions unfortunatley (nous sommes sur un réseau interne). Y at-il un moyen de le faire sans utiliser d'extensions? Cordialement, Will –
@Will Ma solution ne nécessite aucune fonction d'extension à l'exception de l'EXSLt node-set(), qui est implémentée en interne par la plupart des processeurs XSLT 1.0 (comme la classe .NET XslCompiledTransform). Tout modèle FXSL 1.x est écrit en XSLT pur et la seule fonction d'extension utilisée est la fonction EXSLT node-set() déjà mentionnée. Par conséquent, il n'y a absolument aucun obstacle à l'utilisation de cette solution dans un réseau interne - utilisez simplement un processeur XSLT 1.0, qui implémente la fonction EXSLT node-set() .NET XslCompiledTransform, Saxon 6, Xalan, JD, .. ., etc.) –
- 1. Calculer le nombre de mots-clés dans XSLT
- 2. Limiter le nombre de mots avec l'expression régulière
- 3. Utilisez un RegularExpressionValidator pour limiter un nombre de mots?
- 4. Convertir une chaîne en entier dans XSLT 1.0
- 5. XSD: comment limiter le nombre de caractères dans un attribut de type chaîne?
- 6. Limiter le nombre de mots dans une réponse avec une expression régulière
- 7. XSLT 1.0: le tri entre plusieurs documents
- 8. ASP.NET Limiter le nombre téléchargement
- 9. Nombre de mots dans un champ de texte Notes
- 10. PHP: comment limiter le nombre de fichiers de session?
- 11. Trouver le nombre d'occurrences d'une sous-chaîne dans une chaîne en xslt
- 12. Nombre de mots dans Rave Rapport
- 13. Limite Nombre de caractères dans C# Chaîne
- 14. Suppléments de chaîne XSLT
- 15. Comment obtenir le module d'un nombre dans XPath/XSLT?
- 16. stress client: Limiter le nombre de connexions simultanées sous XP
- 17. Comment obtenir le nombre de caractères uniques dans une chaîne
- 18. Comment limiter le nombre d'enregistrements renvoyés pour Interbase 7.1?
- 19. Limiter le nombre de résultats sur un ListView ASP.NET
- 20. gauche assiette espace blanc xslt 1.0
- 21. SharePoint - Comment limiter le nombre de versions par document dans une bibliothèque de documents?
- 22. WPF: Limiter le nombre de caractères sur une ligne
- 23. SQL: Comment limiter le nombre d'enregistrements l'instruction MERGE insérera
- 24. Supprimer le colon et le convertir en nombre dans XSLT
- 25. Affichage d'un nombre en mots dans SSRS
- 26. Comment puis-je faire des opérations de chaîne dans XSLT?
- 27. Mots-clés de la chaîne
- 28. XSLT 1.0: pour chaque noeud terminal vider sa chaîne ancêtre en forme csv
- 29. Trier le tableau par nombre de mots-clés trouvés
- 30. Comment limiter le nombre de téléchargements simultanés dans Asp.net et/ou IIS?
Pouvez-vous clarifier? Voulez-vous sortir les premiers "n" mots, par exemple? –
J'ai posté une solution, qui fonctionne correctement avec un nombre variable de délimiteurs de mots (spécifiés) - contrairement à la solution de Mark Gravell qui traite seulement l'espace comme un délimiteur de mots. –
Salut merci beaucoup pour vos réponses. Juste pour clarifier je ne peux pas lier aux extensions unfortunatley (nous sommes sur un réseau interne). Est-il possible de le faire sans utiliser d'extensions dans XSLT 1.0? Cordialement, Will –