2017-03-10 3 views
1

Je tente de nettoyer certaines données que nous recevons des flux rss à l'aide de XSLT. Je souhaite supprimer toutes les balises sauf la balise p.Supprimer toutes les balises html sauf les balises autorisées à l'aide de la fonction XSLT

Cows are kool.<p>The <i>milk</i> <b>costs</b> $1.99.</p> 

J'ai quelques doutes ici sur la façon de résoudre ce problème en utilisant XSLT dans 1.0 ou 2.0.

1) Je l'ai vu cet exemple https://maulikdhorajia.blogspot.in/2011/06/removing-html-tags-using-xslt.html

Mais je dois les balises p pour être présent et pour lesquels je dois utiliser un regex.Can que nous utilisons la fonction string-avant-match et à faire de la même manière Cette fonction n'est pas présente dans xpath. 2) Je comprends que la fonction de remplacement ne peut pas être utilisée car elle attend une chaîne et si nous passons un nœud quelconque, il extrait le contenu et le passe ensuite à la fonction et, dans ce cas, annule le but de suppression des étiquettes.

J'étais un peu confus car dans cette réponse, un remplacement a été utilisé https://stackoverflow.com/a/18528749/745018.

3) Je fais cela sur le serveur nginx en utilisant xslt.

Veuillez trouver ci-dessous des exemples d'entrées que nous obtenons dans la balise body du flux rss.

<p>The Supreme Court issued on Friday a bailable warrant against sitting Calcutta high court justice CS Karnan, an unprecedented order in a bitter confrontation between the judge and the top court.</p><p>A seven-judge bench headed by Chief Justice of India JS Khehar issued the order directing Karnan’s presence on <h2>March 31</h2> because the judge ignored an earlier court order summoning him.<i>Justice Karnan</i> had to appear</p> 

Mise à jour: Aussi je suis à la recherche d'une fonction xslt pour cette

+2

Please échantillons minimaux mais complets d'entrée XML et le résultat correspondant que vous voulez. Nous devons voir si ce code HTML contenu dans le flux RSS est inclus en tant que balisage ou texte (à l'intérieur d'une section CDATA). Nous avons également besoin de savoir si vous vous attendez à ce que HTML soit analysable en XML ou seulement en HTML. –

+0

@MartinHonnen Mise à jour d'un exemple d'entrée. J'ai besoin que le contenu de cdata soit renvoyé sans les balises html à l'exception de p tag. – crackerplace

Répondre

4

En supposant que vous pouvez utiliser XSLT 2.0, vous pouvez alors appliquer l'analyseur HTML de David Carlisle (https://github.com/davidcarlisle/web-xslt/blob/master/htmlparse/htmlparse.xsl) au contenu de body éléments et processus, puis la résultant des noeuds dans un mode qui supprime tous les éléments, mais p éléments:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
    xmlns:d="data:,dpc" 
    xmlns:xhtml="http://www.w3.org/1999/xhtml" 
    exclude-result-prefixes="d xhtml"> 

    <xsl:import href="htmlparse-by-dcarlisle.xsl"/> 

    <xsl:template match="@*|node()" mode="#default strip"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" mode="#current"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="body"> 
     <xsl:copy> 
      <xsl:apply-templates select="d:htmlparse(., '', true())" mode="strip"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*[not(self::p)]" mode="strip"> 
     <xsl:apply-templates/> 
    </xsl:template> 

</xsl:transform> 

Pour l'entrée

<rss> 
    <entry> 
     <body><![CDATA[<p>The Supreme Court issued on Friday a bailable warrant against sitting Calcutta high court justice CS Karnan, an unprecedented order in a bitter confrontation between the judge and the top court.</p><p>A seven-judge bench headed by Chief Justice of India JS Khehar issued the order directing Karnan’s presence on <h2>March 31</h2> because the judge ignored an earlier court order summoning him.<i>Justice Karnan</i> had to appear</p>]]></body> 
    </entry> 
</rss> 

qui donne

<rss> 
    <entry> 
     <body><p>The Supreme Court issued on Friday a bailable warrant against sitting Calcutta high court justice CS Karnan, an unprecedented order in a bitter confrontation between the judge and the top court.</p><p>A seven-judge bench headed by Chief Justice of India JS Khehar issued the order directing Karnan’s presence on March 31 because the judge ignored an earlier court order summoning him.Justice Karnan had to appear</p></body> 
    </entry> 
</rss> 

Si l'entrée est pas échappé, mais plutôt comme contenu XML dans l'entrée, alors vous n'avez pas besoin de l'analyser, mais pouvez simplement appliquer le mode sur le contenu:

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

    <xsl:template match="@*|node()" mode="#default strip"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" mode="#current"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="body"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()" mode="strip"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*[not(self::p)]" mode="strip"> 
     <xsl:apply-templates/> 
    </xsl:template> 

</xsl:transform> 

http://xsltransform.net/gWEamMc/1

+0

thanks.Assume que le html est déjà analysé. N'ayant que le fonctionne pour supprimer d'autres tags. . – crackerplace

+0

http://xsltransform.net/ejivdJa fonctionne très bien pour moi, vous devrez éditer votre question et fournir des échantillons minimes mais complets de XML, XSLT, la sortie que vous voulez et puis vous obtenez un message d'erreur exacte si vous avez besoin de plus Aidez-moi. –

+0

Oui cela fonctionne.Juste de voir comment le faire fonctionner pour cette entrée http://xsltransform.net/gWEamMc. Mise à jour de la question – crackerplace