J'ai une liste Sharepoint que je veux convertir en JSON via une vue de données XSL.Remplacer le nouveau caractère ligne par <br /> XSL
J'ai une fonction de remplacement récursive XSL que j'utilise pour remplacer tous les caractères spéciaux (barre oblique inverse d'échappement, guillemets doubles à & quot; etc) qui me donne un bon JSON propre qui analyse correctement dans le navigateur des utilisateurs.
La dernière chose dont j'ai besoin pour échapper/remplacer est la nouvelle ligne char. La nouvelle ligne provoque des erreurs dans l'analyse du JSON dans certains navigateurs.
Voici quelques-uns xsl qui teste si le contenu du titre a une nouvelle ligne char, si elle ne nous affichons un paragraphe:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="catalog/cd">
<xsl:if test='contains(title,"
")'>
<p>Found <xsl:value-of select="title" /></p>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Voici quelques-uns échantillon xml:
<catalog>
<cd>
<title>Empire
Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
</cd>
<cd>
<title>Greatest Hits</title>
<artist>Dolly Parton</artist>
<country>USA</country>
<company>RCA</company>
<price>9.90</price>
<year>1982</year>
</cd>
</catalog>
" Empire Burlesque "devrait être le seul élément à réussir le test, mais les trois titres passent l'instruction if et sont sortis.
EDIT
Modification de la solution ci-dessous, je suppose que cela devrait fonctionner si je voulais faire la recherche et de remplacement sur une base de nœud individuel? Je ne serai pas en mesure de le tester dans Sharepoint jusqu'à demain.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:for-each select="catalog/cd">
<xsl:variable name="title_clean">
<xsl:call-template name="repNL">
<xsl:with-param name="pText" select="title"/>
</xsl:call-template>
</xsl:variable>
<p><xsl:value-of select='$title_clean' /></p>
</xsl:for-each>
</xsl:template>
<xsl:template name="repNL">
<xsl:param name="pText" select="."/>
<xsl:copy-of select="substring-before(concat($pText,'
'),'
')"/>
<xsl:if test="contains($pText, '
')">
<br />
<xsl:call-template name="repNL">
<xsl:with-param name="pText" select=
"substring-after($pText, '
')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
On dirait un double: http://stackoverflow.com/questions/3309746 – mzjn
Impossible de reproduire avec les entrées fournies. Pour l'exemple XML et votre exemple XSLT, il s'agit uniquement du titre "Empire Burlesque". Je n'ai pas tous les trois titres dans la sortie. Êtes-vous sûr que l'exemple XML correspond à vos données réelles? –
Bonne question, +1. Voir ma réponse pour une solution complète, courte et facile et pour une explication détaillée. –