Как извлечь конкретные элементы с for-each в XSLT? - PullRequest
0 голосов
/ 10 января 2019

Для моего экзамена в моем классе, где мы узнали о вещах, касающихся XML, DTD, XSD, XSL, нас попросили создать XSLT, который извлек бы из документа XML только парки в городе Сен-Мало, а затем превратить результаты в документ XML. Мои результаты были почти правильными, но не совсем. Уже слишком поздно менять мою оценку, но мне просто интересно, как это сделать.

Вот фрагмент оригинального XML:

<entry>
        <id>https://www2.mgcloud.fr/dataserver/tourismebretagne/data/jardins35fr('PCUBRE0351000100')</id>
        <title type="text">'PCUBRE0351000100'</title>
        <updated>2015-05-25T06:18:05Z</updated>
        <author>
            <name>https://www2.mgcloud.fr/dataserver/tourismebretagne/catalog/agents/17692</name>
        </author>
        <link rel="edit" title="jardins35frType" href="jardins35fr('PCUBRE0351000100')"/>
        <category term="fr.mgdis.odata.data.jardins35frType" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
        <content type="parc">
            <properties>
                <num_id>PCUBRE0351000100</num_id>
                <titre>Le Domaine de la Briantais</titre>
                <theme>Parc</theme>
                <telephone>02 99 81 83 42</telephone>
                <fax>02 99 82 51 56</fax>
                <web>www.ville-saint-malo.fr</web>
                <mail>deep@saint-malo.fr</mail>
                <adresse>Rue Maurice Nogues</adresse>
                <code_postal>35400</code_postal>
                <insee>35288</insee>
                <commune>Saint-Malo</commune>
                <latitude>48.6194348</latitude>
                <longitude>-2.0147895</longitude>
                <pmr>Oui</pmr>
                <descriptif>Le Château a été construit à partir de 1864, en remplacement d'un vieux manoir du XVIIème siècle qui appartenait à  de notables armateurs malouins. La famille La Chambre en devient propriétaire en 1888. Il est entouré d'un parc de 27 hectares surplombant la Tour Solidor, et la vallée de la Rance. Parc ouvert de 9h à 19h en juillet et août. Ouvert de 14h à 17h ou 18h en semaine hors saison, et de 9h à 17h ou 19h les week-ends et jours fériés toujours en basse saison. Parc avec vues sur mer. Renseignements : ville de Saint Malo - Direction de l'Environnement et de l'Espace Public - Division des Espaces verts. 02 99 81 83 42 pour tout renseignement complémentaire.</descriptif>
                <photos>http://cdt29.media.tourinsoft.com/upload/4CECC4CF-0833-47A8-9B65-762C434CC0D0/Dinard-vu-de-la-Briantais.jpg</photos>
            </properties>
        </content>
    </entry>

Вот XSLT, который я написал:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="4.0" indent="yes"/>
    <xsl:template match="/">
        <parcs_et_jardins_de_Saint_Malo>
            <xsl:for-each select="//properties[commune='Saint-Malo']">
                <titre><xsl:value-of select="//titre"/></titre>
            </xsl:for-each>
        </parcs_et_jardins_de_Saint_Malo>
    </xsl:template>
</xsl:stylesheet>

Вот что у меня было для итогового XML-документа:

<?xml version="4.0"?>
<parcs_et_jardins_de_Saint_Malo>
  <titre>Parc Oberthur</titre>
  <titre>Parc Oberthur</titre>
  <titre>Parc Oberthur</titre>
  <titre>Parc Oberthur</titre>
  <titre>Parc Oberthur</titre>
  <titre>Parc Oberthur</titre>
  <titre>Parc Oberthur</titre>
</parcs_et_jardins_de_Saint_Malo>

Очевидно, это не сработало для меня, но я не могу понять, почему. Проблема в том, что элемент «коммуна» может содержать в себе другие города, и мы не хотели вносить эти результаты в игру - только те, что в Сен-Мало. Мой XSLT генерировал один и тот же город снова и снова - хотя количество элементов - это правильное число (количество титров элементов равно количеству упоминаний о Сен-Мало).

Буду признателен за помощь и надеюсь, что это не слишком смущает.

1 Ответ

0 голосов
/ 10 января 2019

Просто замените это ....

 <titre><xsl:value-of select="//titre"/></titre>

С этим ....

<titre><xsl:value-of select="titre"/></titre>

Делая // в начале выражения, вы ищите во всем XML для titre, начиная с узла документа. Таким образом, он выберет все titre узлов в документе. В XSLT 1.0 xsl:value-of будет возвращать значение первого узла, только если выбрано несколько узлов.

Делая <xsl:value-of select="titre"/>, вы выбираете только элементы titre, которые являются дочерними элементами текущего properties, выбранного вами с помощью xsl:for-each.

Обратите внимание: если целью является получение только titre узлов, то вместо этого ...

<xsl:for-each select="//properties[commune='Saint-Malo']">
  <titre><xsl:value-of select="titre"/></titre>
</xsl:for-each>

Вы можете сделать это, чтобы скопировать все подходящие узлы

<xsl:copy-of select="//properties[commune='Saint-Malo']/titre" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...