2010-07-30 12 views
1

J'ai écumé l'Internet pour découvrir cette méthode de trouver le nombre de lignes dans un élément xml .:QUESTION XSL: méthode pour compter le nombre de lignes ou de caractères newline d'un attribut XML

<xsl:if test="string-length(@Example) - string-length(translate(@Example, '&#xa;', '')) &lt; 10"> 

Dans l'exemple ci-dessus, @Example est l'élément pour lequel le nombre de lignes est compté. Je n'aimais pas ce code, cependant, car il est automatiquement transformer en ceci:

<xsl:if test="string-length(@Example) - string-length(translate(@Example, ' 
', '')) &lt; 10"> 

Vous voyez, le code &#xa; transformé en obtient ligne blanche littérale (ce qui représente, mais je ne veux pas que ça être une ligne vide). Cela me semble être un mauvais style de codage (si ce n'est pas le cas, dites-le moi), donc je veux un moyen alternatif pour trouver le nombre de lignes dans @Example. Je vous remercie.

+0

Vous devez modifier votre titre. Vous n'avez pas affaire à des éléments mais à des attributs. En outre, en tant que dernière réponse, vous pouvez le faire avec XSLT 2.0 (accès à un document non analysé et utilisation d'une correspondance regexp). Mais, une réponse complète pour XSLT 2.0 nécessiterait un échantillon d'entrée et une sortie désirée. –

+0

Shoot, ne savait pas que vous avez commenté. Désolé, je n'ai pas de compréhension fondamentale de xsl ou xml, donc ce truc va juste sur ma tête .. Mais je vais regarder dans le xslt 2.0. – ShareOnPoint

+0

Bonne question (+1). J'ai essayé de trouver quelque chose de mieux et je pense que je l'ai fait - jetez un oeil à ma réponse. –

Répondre

0

Ce style est probablement plus proche de vos préférences:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:variable name="vNL" select="'&#xA;'"/> 

<xsl:template match="t"> 
    <xsl:value-of select= 
    "string-length(@Example) 
    - 
    string-length(translate(@Example, $vNL, ''))"/> 
</xsl:template> 
</xsl:stylesheet> 

La constante NL est maintenue dans une variable et faisant référence à cette variable ne provoque pas un éditeur pour afficher une nouvelle ligne.

Même la déclaration $vNL peuvent être guéries de ce problème - à condition que cela est fait dans une <xsl:param> globale et la valeur est fournie par l'invocateur externe de la transformation.

+0

Oui. Mais comme je réponds précédemment, seule la référence de caractère ** de nouvelle ligne ** dans la source d'entrée sera conservée dans la valeur d'attribut après la normalisation. –

+0

@Alejandro: Désolé, je vous ai complètement perdu. Y a-t-il un problème? –

0

Juste pour clarifier ma réponse précédente (https://stackoverflow.com/questions/3366181/sharepoint-designer-keeps-turning-xa-within-source-code-into-literal-new-line)

L'exécution de cette feuille de style (comme Dimitre):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:variable name="vNL" select="'&#xA;'"/> 

<xsl:template match="xsl:value-of"> 
    <xsl:value-of select= 
    "string-length(@select) 
    - 
    string-length(translate(@select, $vNL, ''))"/> 
</xsl:template> 
</xsl:stylesheet> 

avec lui-même comme entrée, sortie:

0 

Il ne fonctionne avec une entrée comme celle-ci:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:variable name="vNL" select="'&#xA;'"/> 

<xsl:template match="xsl:value-of"> 
    <xsl:value-of select= 
    "string-length(@select)&#xA; 
    -&#xA; 
    string-length(translate(@select, $vNL, ''))"/> 
</xsl:template> 
</xsl:stylesheet> 

Sortie:

2