如何在第一个

时间:2017-12-11 12:48:28

标签: html xml xslt

您好,感谢您抽出时间阅读和帮助。

我开始对XSLT 1.0如何处理XML有很好的了解,但我还不知道这个。

我的问题是我有一个模板匹配第一个节点并应用模板选择兄弟姐妹,这些模板在第二个节点处理,但我最终处理了两次兄弟姐妹节点。

<xsl:template match="/Publication/QuestionReponse[1]">
<div class="bloc_Question">
  <h5 id="titre_Question" class="mb-0">
    Questions ? Réponses !
  </h5>
  <xsl:variable name="lien" select="@URL"/>
  <ul>
    <li>
      <a class="a_extra" href="{$lien}">
        <xsl:value-of select="."/>
      </a>
    </li>
    <xsl:apply-templates select="following-sibling::QuestionReponse"/>
  </ul>
</div>

XSLT应该在兄弟上使用的另一个模板:

<xsl:template match="QuestionReponse">
<xsl:variable name="lien" select="@URL"/>
<li>
  <a class="a_extra" href="{$lien}">
    <xsl:value-of select="."/>
  </a>
</li>

使用以下简化的XML结构:

<Publication>
 <QuestionReponse>
  Question1
 </QuestionReponse>
 <QuestionReponse>
  Question2
 </QuestionReponse>
 ...
</Publication>

这是有效的,并创建了一个包含我所有想要的节点内容的列表。

问题是我的“QuestionReponse”节点(第一个获得它自己的模板的节点)被匹配两次,因此在我的html中我最终得到以下结构:

<div>
 <ul>
  <li>
   Question1
  </li>
  <li>
  Question2
  </li>
 </ul>
</div>
 <li>
  Question2
 </li>

所以我不明白为什么XSLT在我已处理的节点中第二次传递,有没有办法告诉XSLT在我的第二个模板中标记节点?我想问题是XSLT输入我的第一个模板然后是我的第二个模板(通过非“自然”方式),因此节点不会被“处理”XSLT,然后在一般递归处理期间返回并再次处理它们。

我是否严重执行此操作?除了使用模式和调用模板之外没有办法吗?欢迎任何建议。

我的完整XSL是(有关部分在最后):

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <xsl:output method="html" encoding="iso-8859-1" indent="no"/>
  <!-- Overiding Built-In Template -->
  <xsl:template match="text() | @*"/>
  <!-- -->
  <xsl:template match ="/">
    <head>
      <title>
      </title>
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js">
      </script>
      <script src="/js/tether.min.js">
      </script>
      <link href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400" rel="stylesheet"/>
      <link href="/css/bootstrap.min.css" rel="stylesheet" type="text/css"/>
      <link rel="stylesheet" type="text/css" href="../css/style.css"/>
      <script src="/js/bootstrap.min.js">
      </script>
      <script src="/js/fonctions.js">
      </script>
    </head>
    <body>
      <div id="main_container" class="container-fluid">
        <div class="col-sm-8">
          <xsl:apply-templates/>
        </div>
      </div>
    </body>
  </xsl:template>
  <!-- ============ General Component Templates ============== -->
  <!-- Fil D'Arianne -->
  <xsl:template match="FilDAriane">
    <div class="row">
      <div class="fildariane">
        <ol class="breadcrumb">
          <xsl:apply-templates/>
        </ol>
      </div>
    </div>
  </xsl:template>
  <xsl:template match="FilDAriane/Niveau">
    <xsl:choose>
      <xsl:when test="position()=2">
        <li class="breadcrumb-item">
          <a href="arborescence.html" class="breadcrumb-inactive">
            <xsl:value-of select="."/>
          </a>
        </li>
      </xsl:when>
      <xsl:when test="last()-1 = position()">
        <li class="breadcrumb-item active">
          <xsl:value-of select="."/>
        </li>
      </xsl:when>
      <xsl:otherwise>
        <xsl:variable name="ID" select="@ID"/>
        <li class="breadcrumb-item">
          <a href="{$ID}.html" class="breadcrumb-inactive">
            <xsl:value-of select="."/>
          </a>
        </li>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  <!-- Paragraphe -->
  <xsl:template match="Paragraphe">
    <p>
      <xsl:value-of select="."/>
    </p>
  </xsl:template>
  <!-- Liste -->
  <xsl:template match="Liste[@type='puce']">
    <ul>
      <xsl:for-each select="Item">
        <li>
          <xsl:apply-templates/>
        </li>
      </xsl:for-each>
    </ul>
  </xsl:template>
  <!-- ANoter -->
  <xsl:template match="ANoter">
    <div class="anoter">
      <p class="titre_anoter">
        <img class="img_anoter" src="../img/anoter.svg"></img>
        <strong>
          <xsl:value-of select="Titre"/>
          :
        </strong>
      </p>
      <xsl:apply-templates/>
    </div>
  </xsl:template>
  <!-- Titre de Fiche -->
  <xsl:template match="/Publication/dc:title">
    <div class="row">
      <div class="title">
        <xsl:value-of select="."/>
      </div>
    </div>
  </xsl:template>
  <!-- Attention -->
  <xsl:template match="Attention">
    <div class="attention">
      <p class="titre_attention">
        <img class="img_attention" src="../img/warning.svg"></img>
        <strong>
          <xsl:value-of select="Titre"/>
          :
        </strong>
      </p>
      <xsl:apply-templates/>
    </div>
  </xsl:template>
  <!-- ASavoir -->
  <xsl:template match="ASavoir">
    <div class="asavoir">
      <p class="titre_asavoir">
        <img class="img_asavoir" src="../img/asavoir.svg"></img>
        <strong>
          <xsl:value-of select="Titre"/>
          :
        </strong>
      </p>
      <xsl:apply-templates/>
    </div>
  </xsl:template>
  <!-- LienInterne -->
  <xsl:template match="LienInterne">
    <xsl:variable name="lien" select="@LienPublication"/>
    <xsl:variable name="type" select="@type"/>
    <a class="lieninterne" title="Aller vers {$type}" alt="{$type}" href="/html/{$lien}.html">
      <xsl:apply-templates/>
    </a>
  </xsl:template>
  <!-- LienIntra -->
  <xsl:template match="LienIntra">
    <xsl:variable name="lien" select="@LienID"/>
    <xsl:variable name="type" select="@type"/>
    <a class="lienintra" title="Aller vers {$type}" alt="{$type}" href="/html/{$lien}.html">
      <xsl:apply-templates/>
    </a>
  </xsl:template>
  <!-- Service en Ligne -->
  <xsl:template match="ServiceEnLigne">
    <div class="container-fluid">
      <div class="service_en_ligne">
        <div id="row_1_service" class="row">
          <div id="col_svg_service" class="col-1">
            <!-- TODO virer le svg en dur -->
            <svg id="icon-document" viewBox="0 0 1334 1024" width="100%" height="100%">
              <title>document</title>
              <path class="color-9" d="M826.18 18.050h-673.263c-64.399 0-117.090 52.69-117.090 117.090v731.809c0 64.399 52.69 117.090 117.090 117.090h673.263c64.399 0 117.090-52.69 117.090-117.090v-731.809c0-64.399-52.69-117.090-117.090-117.090z"></path>
              <path class="color-39" d="M738.363 281.502h-526.903c-17.563 0-29.272 11.708-29.272 29.272s11.708 29.272 29.272 29.272h526.903c17.563 0 29.272-11.708 29.272-29.272s-11.708-29.272-29.272-29.272z"></path>
              <path class="color-39" d="M562.731 457.137h-351.268c-17.563 0-29.272 11.708-29.272 29.272s11.708 29.272 29.272 29.272h351.268c17.563 0 29.276-11.708 29.276-29.272s-11.708-29.272-29.276-29.272z"></path>
              <path class="color-39" d="M416.368 632.77h-204.906c-17.563 0-29.272 11.708-29.272 29.272s11.708 29.276 29.272 29.276h204.906c17.563 0 29.276-11.708 29.276-29.276s-11.708-29.272-29.276-29.272z"></path>
              <path class="color-accent" d="M627.129 600.568l84.89 84.89 424.449-424.449-84.89-84.89-424.449 424.449zM1180.375 47.32l-84.89 84.89 84.89 84.89 84.89-84.89-84.89-84.89zM562.731 749.859l108.308-23.418-81.963-81.963-26.344 105.38z"></path>
            </svg>
          </div>
          <div id="container_cerfa" class="container-fluid">
            <div class="row">
              <p class="service_type">
                <xsl:value-of select="@type"/>
              </p>
            </div>
            <div class="row">
              <h5 class="service_titre">
                <xsl:value-of select="./Titre"/>
              </h5>
            </div>
          </div>
        </div>
        <xsl:if test="@numerocerfa">
          <p class="service_duo_cerfa_intro">
            <p class="service_cerfa">
              <strong>
                Cerfa n°<xsl:value-of select="@numerocerfa"/>
              </strong>
            </p>
            <p class="service_introduction">
              <xsl:value-of select="./Introduction/Texte/Paragraphe"/>
            </p>
          </p>
        </xsl:if>
        <div class="service_p_btn">
          <xsl:variable name="lien" select="@URL"/>
          <button type="button" class="btn btn-primary">
            <a class="btn_link" href="{$lien}">
              Accéder au formulaire
            </a>
          </button>
          <p class="service_source">
            <xsl:value-of select="./Source"/>
          </p>
        </div>
        <xsl:if test="./NoticeLiee">
          <div id="row_service_notice_texte" class="row">
            <p>
              <strong>
                Pour vous aider à remplir le formulaire :
              </strong>
            </p>
          </div>
          <div id="row_service_notice_lien" class="row">
            <xsl:variable name="lien2" select="@URL"/>
            <p>
              <a class="link_service" href="{$lien2}">
                <xsl:value-of select="./NoticeLiee"/>
              </a>
            </p>
          </div>
        </xsl:if>
      </div>
    </div>
  </xsl:template>
  <xsl:template match="/Publication/QuestionReponse[1]">
    <div class="bloc_Question">
      <h5 id="titre_Question" class="mb-0">
        Questions ? Réponses !
      </h5>
      <xsl:variable name="lien" select="@URL"/>
      <ul>
        <li>
          <a class="a_extra" href="{$lien}">
            <xsl:value-of select="."/>
          </a>
        </li>
        <xsl:apply-templates select="following-sibling::QuestionReponse"/>
      </ul>
    </div>
  </xsl:template>
  <xsl:template match="QuestionReponse">
    <xsl:variable name="lien" select="@URL"/>
    <li>
      <a class="a_extra" href="{$lien}">
        <xsl:value-of select="."/>
      </a>
    </li>
  </xsl:template>

  <!-- EndOf General Component Templates -->
</xsl:stylesheet>

我的完整XML是(有关节点在最后):

<?xml version="1.0" encoding="UTF-8"?><Publication xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ID="F1567" type="Fiche Question-réponse" xsi:noNamespaceSchemaLocation="../Schemas/3.0/Publication.xsd">
<dc:title>Un mineur peut-il porter plainte seul ?</dc:title>
<dc:creator>Direction de l'information légale et administrative</dc:creator>
<dc:subject>Justice</dc:subject>
<dc:description>Oui, un mineur peut se rendre seul à la police ou à la gendarmerie pour signaler une infraction. Mais il ne peut pas se porter seul partie civile</dc:description>
<dc:publisher>Direction de l'information légale et administrative</dc:publisher>
<dc:contributor>Direction de l'information légale et administrative (Premier ministre), Ministère chargé de la justice</dc:contributor>
<dc:date>modified 2017-07-13</dc:date>
<dc:type>Question-réponse</dc:type>
<dc:format>text/xml</dc:format>
<dc:identifier>F1567</dc:identifier>
<dc:source>http://www.legifrance.gouv.fr/affichCode.do?idSectionTA=LEGISCTA000024458641&amp;cidTexte=LEGITEXT000006071154</dc:source>
<dc:language>Fr</dc:language>
<dc:relation>isPartOf N260</dc:relation>
<dc:coverage>France entière</dc:coverage>
<dc:rights>https://www.service-public.fr/a-propos/mentions-legales</dc:rights>
<SurTitre>Question-réponse</SurTitre>
<Audience>Particuliers</Audience>
<Canal>www.service-public.fr</Canal>
<FilDAriane>
<Niveau ID="Particuliers">Accueil particuliers</Niveau>
<Niveau ID="N19807">Justice</Niveau>
<Niveau ID="N260">Mineur victime</Niveau>
<Niveau ID="F1567" type="Fiche Question-réponse">Un mineur peut-il porter plainte seul ?</Niveau>
</FilDAriane>
<Theme ID="N19807">
<Titre>Justice</Titre>
</Theme>
<SousThemePere ID="N20279">Justice des mineurs</SousThemePere><DossierPere ID="N260">
<Titre>Mineur victime</Titre>
<Fiche ID="F20283">Vol ou racket</Fiche>
<Fiche ID="F952">Mauvais traitements</Fiche>
<Fiche ID="F2274">Infraction sexuelle</Fiche>
<Fiche ID="F2532">Prostitution infantile</Fiche>
<Fiche ID="F31985">Harcèlement à l'école</Fiche>
</DossierPere>

<Texte><Paragraphe>Un mineur victime d'une infraction peut <LienInterne LienPublication="F1435" type="Fiche d'information" audience="Particuliers">porter plainte</LienInterne> lui-même en écrivant au procureur ou en se rendant (seul ou accompagné) dans les locaux de la police ou de la gendarmerie.</Paragraphe>
<BlocCas affichage="onglet">
<Cas>
<Titre>
<Paragraphe>Sur place</Paragraphe>
</Titre>
										<Paragraphe>Vous devez vous adresser à un commissariat de police ou une brigade de gendarmerie.</Paragraphe>
										<OuSAdresser ID="R13" type="Local personnalisable">
<Titre>Commissariat ou Gendarmerie</Titre>
<PivotLocal>commissariat_police</PivotLocal>
<RessourceWeb URL="http://www.interieur.gouv.fr/Contact/Contacter-une-brigade-de-gendarmerie-ou-un-commissariat-de-police"/>
</OuSAdresser>

										<Paragraphe>La réception de la plainte ne peut pas vous être refusée.</Paragraphe>
										<Paragraphe>La plainte est ensuite transmise au procureur de la République.</Paragraphe>
										<Paragraphe>Avant de vous rendre au commissariat ou à la gendarmerie, vous pouvez remplir une pré-plainte en ligne si vous êtes victime d'une atteinte aux biens (vol, escroquerie....) dont l'auteur vous est inconnu. Vous obtiendrez alors un rendez-vous et les policiers ou gendarmes auront déjà les éléments de votre plainte à votre arrivée.</Paragraphe>
										<ServiceEnLigne ID="R19620" URL="https://www.pre-plainte-en-ligne.gouv.fr/" numerocerfa="16309*01" autrenumero="16310*01" type="Téléservice">
<Titre>Pré-plainte en ligne</Titre>
<Source ID="R30603">Ministère chargé de l'intérieur</Source>
</ServiceEnLigne>

									
</Cas>
<Cas>
<Titre>
<Paragraphe>Par correspondance</Paragraphe>
</Titre>
										<Paragraphe>Vous devez écrire directement au procureur de la République. Il faut envoyer une <LienInterne LienPublication="R11469" type="Modèle de document" audience="Particuliers">lettre sur papier libre</LienInterne> au tribunal de grande instance du lieu de l'infraction ou du domicile de l'auteur de l'infraction.</Paragraphe>
										<Paragraphe>La lettre doit préciser :</Paragraphe>
										<Liste type="puce">
											<Item>
												<Paragraphe>l'état civil complet du plaignant et ses coordonnées complètes (adresse et numéro de téléphone),</Paragraphe>
											</Item>
											<Item>
												<Paragraphe>le récit détaillé des faits, la date et le lieu de l'infraction,</Paragraphe>
											</Item>
											<Item>
												<Paragraphe>le nom de l'auteur supposé si vous le connaissez (sinon, il convient de déposer plainte contre X),</Paragraphe>
											</Item>
											<Item>
												<Paragraphe>les noms et adresses des éventuels témoins de cette infraction,</Paragraphe>
											</Item>
											<Item>
												<Paragraphe>la description et l'estimation provisoire ou définitive du préjudice,</Paragraphe>
											</Item>
											<Item>
												<Paragraphe>les documents de preuve  : certificats médicaux constatant les blessures, arrêts de travail, factures diverses, constats en cas de dégâts matériels.</Paragraphe>
											</Item>
										</Liste>
									
										<OuSAdresser ID="R30" type="Local personnalisé sur SP">
<Titre>Tribunal de grande instance (TGI)</Titre>
<PivotLocal>tgi</PivotLocal>
<RessourceWeb URL="http://www.annuaires.justice.gouv.fr/annuaires-12162/annuaire-des-tribunaux-de-grande-instance-21768.html"/>
<Source ID="R30663">Ministère chargé de la justice</Source>
</OuSAdresser>

									
										<Paragraphe>Vous pouvez envoyer votre plainte en lettre recommandée avec accusé de réception mais ce n'est pas obligatoire, vous pouvez envoyer une lettre simple. Dans tous les cas, un récépissé vous sera remis dès que le procureur aura enregistré votre plainte.</Paragraphe>
									
</Cas>
</BlocCas>

<Paragraphe>Le mineur peut ainsi signaler toute infraction dont il est victime à la justice. Mais s'il veut être impliqué dans le reste de la procédure, il devra obligatoirement être représenté par une personne majeure.</Paragraphe>
<Paragraphe>Ainsi, si sa plainte donne lieu à des poursuites, le mineur souhaitant obtenir une indemnisation doit <LienInterne LienPublication="F1454" type="Fiche Question-réponse" audience="Particuliers">se constituer partie civile</LienInterne> via des personnes majeures agissant en son nom :</Paragraphe>
<Liste type="puce">
<Item>
<Paragraphe>ses parents (ou ses représentants légaux),</Paragraphe>
</Item>
<Item>
<Paragraphe>ou un <LienExterne URL="http://www.justice.gouv.fr/publication/guide_aah.pdf">administrateur ad hoc</LienExterne>

 désigné par la justice, lorsque les parents du mineur ne peuvent pas défendre ses intérêts. C'est notamment le cas si les parents sont impliqués dans l'infraction, en cas de <LienInterne LienPublication="F952" type="Fiche d'information" audience="Particuliers">maltraitance</LienInterne> par exemple.</Paragraphe>
</Item>
</Liste>
<ANoter>
<Titre>À noter</Titre><Paragraphe>les parents d'un mineur peuvent également porter plainte en son nom, sans besoin d'un accord de l'enfant.</Paragraphe>
</ANoter>
</Texte>
<OuSAdresser ID="R167" type="Centre de contact">
<Titre>08 Victimes</Titre>
<Source ID="R30797">Institut national d'aide aux victimes et de médiation (Inavem)</Source><Texte>
						
								<Paragraphe>
			
      Écoute, informe et conseille les victimes d'infractions ainsi que leurs proches.</Paragraphe>
							
						<Chapitre>
<Titre>
<Paragraphe>Par téléphone</Paragraphe>
</Titre>
								<Paragraphe>
			<MiseEnEvidence>08 842 846 37</MiseEnEvidence>
      depuis la France métropolitaine</Paragraphe>
								<Paragraphe>Ouvert 7 jours sur 7 de 9h à 21h</Paragraphe>
								<Paragraphe>Numéro gris ou banalisé : coût d'un appel vers un fixe et service gratuit, depuis un téléphone fixe ou mobile</Paragraphe>
								<Paragraphe>
<MiseEnEvidence>+33 (0)1 41 83 42 08</MiseEnEvidence> depuis l'outre-mer ou l'étranger</Paragraphe>
								<Paragraphe>Ouvert 7 jours sur 7 de 9h à 21h</Paragraphe>
								<Paragraphe>
			Coût d'un appel local depuis un poste fixe</Paragraphe>
							</Chapitre>
						<Chapitre>
<Titre>
<Paragraphe>Par courriel</Paragraphe>
</Titre>
								<Paragraphe>En utilisant le <LienExterne URL="http://www.inavem.org/index.php/component/chronoforms5/?chronoform=contact_victimes">formulaire de contact</LienExterne>
</Paragraphe>
							</Chapitre>
					</Texte>
</OuSAdresser>
<Reference type="Texte de référence" URL="http://www.legifrance.gouv.fr/affichCode.do?idSectionTA=LEGISCTA000024458641&amp;cidTexte=LEGITEXT000006071154" ID="R15905">
<Titre>Code de procédure pénale : articles 1 à 10</Titre>
<Complement>Début d'une procédure pénale</Complement>
</Reference>
<ServiceEnLigne ID="R11469" URL="" type="Modèle de document">
<Titre>Porter plainte auprès du procureur de la République</Titre>
<Source ID="R30608">Direction de l'information légale et administrative (Premier ministre)</Source>
</ServiceEnLigne>
<ServiceEnLigne ID="R19620" URL="https://www.pre-plainte-en-ligne.gouv.fr/" numerocerfa="16309*01" autrenumero="16310*01" type="Téléservice">
<Titre>Pré-plainte en ligne</Titre>
<Source ID="R30603">Ministère chargé de l'intérieur</Source>
</ServiceEnLigne>
<PourEnSavoirPlus type="Information pratique" ID="R35961" URL="http://www.interieur.gouv.fr/A-votre-service/Ma-securite/Aide-aux-victimes" audience="Particuliers">
<Titre>Guide des droits des victimes</Titre>
<Source ID="R30603">Ministère chargé de l'intérieur</Source>
</PourEnSavoirPlus>
<PourEnSavoirPlus type="Information pratique" ID="R41472" URL="http://www.justice.gouv.fr/justice-des-mineurs-10042/" audience="Particuliers">
<Titre>La justice des mineurs</Titre>
<Source ID="R30663">Ministère chargé de la justice</Source>
</PourEnSavoirPlus>
<QuestionReponse ID="F1154" audience="Particuliers">Le procureur est-il tenu d'engager des poursuites à la suite d'une plainte ?</QuestionReponse>
<QuestionReponse ID="F16862" audience="Particuliers">Peut-on retirer une plainte et quelles en sont les conséquences ?</QuestionReponse>

</Publication>

1 个答案:

答案 0 :(得分:1)

你的问题就是这个电话

<xsl:apply-templates/>

在父上下文和此调用中

<xsl:apply-templates select="following-sibling::QuestionReponse"/>

在子环境中。两者都处理相同的QuestionReponse节点,如下所示:

第一个<xsl:apply-templates/>适用于/的所有子项,因为它位于匹配/的模板中,并且不会选择任何目标。

因此它适用于<Publication><Publication>没有模板。不具备匹配模板的元素的默认行为是<xsl:apply-templates/> 以及,但这次<Publication>的所有子项都会受到影响。

第一个<QuestionReponse>有一个特殊模板。这会运行,并在内部调用<xsl:apply-templates select="following-sibling::QuestionReponse"/>,它会处理所有剩余的<QuestionReponse>元素。

但是更高级<xsl:apply-templates/>无法知道这一点。它尚未完成,并继续将模板应用于尚未处理的所有节点。因此,第二次处理所有<QuestionReponse>元素。结果:<QuestionReponse>的所有非首位<Publication>儿童出现两次。

解决方案:在父上下文中,将模板应用于除非首先<QuestionReponse>元素之外的所有子项

<xsl:apply-templates select="*[not(self::QuestionReponse and preceding-sibling::QuestionReponse)]" />

还有其他方法可以表达相同的内容,但&#34;不是<QuestionReponse>,其前面有<QuestionReponse>&#34; 足够接近。

行为的变化是,较高级<xsl:apply-templates/>现在主动排除在子模板中单独处理的元素。