Jump to content

Parsing XML with XSLT


crult

Recommended Posts

Hello,I have a folder containing a large number of .xml files. Alternatively, i have also a .txt file that contains all these .xml like text. These documents come from newspaper's articles in xml format. There's is a sample:

<?xml version="1.0" encoding="UTF-8"?><Document xyurl="xyl://20040101N0076.xml"><Texte><P>Outre leurs activités habituelles, les hôpitaux ont dû faire face à une catastrophe exceptionnelle, durant l'été : la canicule, qui a provoqué 15 000 morts en août. Les urgentistes ont été les premiers à porter le drame sur la place publique. Près de 3 000 décès sont survenus dans des maisons de retraite et plus de 6 000 à l'hôpital ou en clinique, a révélé une étude de l'Institut national de la santé et de la recherche médicale (Inserm). Mais près de la moitié des personnes ayant trouvé la mort à l'hôpital venaient de maisons de retraite et de centres de long séjour. En reconnaissance de la « mobilisation exceptionnelle » des personnels hospitaliers ayant travaillé du 7 au 19 août, le ministère de la santé a annoncé, le 1er décembre, qu'une prime de 90 à 130 euros leur serait allouée. L'idée a été critiquée par des syndicats hospitaliers, qui soulignent la nécessité de donner des moyens « pérennes » aux hôpitaux.</P><P/></Texte></Document><?xml version="1.0" encoding="UTF-8"?><Document xyurl="xyl://20040101N0077.xml"><Texte><P>« C'est le plus beau réveillon de ma vie. » Alexis, passionné de spéléologie et d'escalade, a fêté Noël dans les arbres, parc Paul-Mistral, à Grenoble, et passera de la même façon le Nouvel An. Il est l'un des « accro-citoyens » qui, depuis plus de huit semaines, résistent au froid et même à la neige, perchés dans de drôles de petites cahutes faites de bâches en plastique. Ils espèrent empêcher l'abattage de 300 arbres, prévu dans le cadre de la construction du nouveau stade de football de l'agglomération.</P><P>Trois au départ, ils sont aujourd'hui une cinquantaine à se relayer jour et nuit pour assurer la garde des arbres parmi lesquels un orme champêtre, l'un des rares spécimens survivants d'une espèce décimée par la maladie de la graphiose. Originaires de Grenoble, ou venus d'ailleurs « par solidarité », ils passent une ou plusieurs nuits. Chômeurs, étudiants, intermittents du spectacle, routards ou saisonniers, beaucoup ont en commun la passion de la grimpe. Aucun n'est contre le football. Tous demandent un gel des travaux, la révision du projet et l'étude d'un nouvel emplacement. Ils souhaitent surtout que la population soit consultée.</P></Texte></Document>

As you can see there are many tags, but i'm interested in the tag <Texte> wich contains the main article. I'm searching for a XSLT scenario that allows me to:

  • Export the contents of all the tags <Texte>. Only the contents (articles), without the tags. The result must be printed in a separate .txt file. If it's possible, to print leaving some space to separate the body of each article. Something like paragraphs.
  • Parse each article contained in the tags <Texte>. The result must be printed in a separate .txt file that contains a list of all the words in the article, excluding the marks as . , : etc

Thank you for the help!

Link to comment
Share on other sites

Well you could use an XSLT 2.0 processor like Saxon 9.2 (http://saxon.sourceforge.net/) that allows you to process a collection of xml files in a certain directory with the help of the collection function (http://www.saxonica.com/documentation/sourcedocs/collections.html)

<xsl:stylesheet  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="2.0">  <xsl:output method="text"/>  <xsl:template name="main">	<xsl:value-of select="collection('directorypathorname?select=*.xml')//Texte" separator=""/>  </xsl:template></xsl:stylesheet>

then run it with

java -jar saxon9.jar -xsl:sheet.xsl -it:main -o:output.txt

That should solve the first problem.The second problem is more difficult as what forms a word in a text is more difficult to define and to determine programmatically. XSLT 2.0 has support for regular expressions so you could use e.g.

<xsl:stylesheet  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="2.0">  <xsl:output method="text" encoding="UTF-8"/>  <xsl:template name="main">	<xsl:for-each select="collection('directorypathorname?select=*.xml')//Texte">	  <xsl:analyze-string select="." regex="\w+">		<xsl:matching-substring>		  <xsl:value-of select="."/>		  <xsl:text> </xsl:text>		</xsl:matching-substring>	  </xsl:analyze-string>	</xsl:for-each>  </xsl:template></xsl:stylesheet>

and it would output (with your first input sample)

Outre leurs activités habituelles les hôpitaux ont dû faire face à une catastrophe exceptionnelle durant l été la canicule qui a provoqué 15 000 morts en août Les urgentistes ont été les premiers à porter le drame sur la place publique Près de 3 000 décès sont survenus dans des maisons de retraite et plus de 6 000 à l hôpital ou en clinique a révélé une étude de l Institut national de la santé et de la recherche médicale Inserm Mais près de la moitié des personnes ayant trouvé la mort à l hôpital venaient de maisons de retraite et de centres de long séjour En reconnaissance de la mobilisation exceptionnelle des personnels hospitaliers ayant travaillé du 7 au 19 août le ministère de la santé a annoncé le 1er décembre qu une prime de 90 à 130 euros leur serait allouée L idée a été critiquée par des syndicats hospitaliers qui soulignent la nécessité de donner des moyens pérennes aux hôpitaux

You would need to tune the regular expression for french rules probably but that is up to you.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...