【问题标题】:XSLT/XPATH not matching nodeXSLT/XPATH 不匹配节点
【发布时间】:2018-04-18 09:11:38
【问题描述】:

感谢您抽出宝贵时间阅读和帮助 :)

我遇到了一个问题,我还不知道如何解决。我的完整 XSL 文件中有一个正确的 XPATH 表达式,它应该匹配但不匹配,我已经在一个空白 XSL 文件中对其进行了测试,当它不在我的完整文件中时它运行良好。

XPATH 匹配表达式:

  <xsl:template match="/Publication/Texte/Chapitre/BlocCas/Cas/Liste/Item/Paragraphe/LienIntra">

这个(以及许多其他正确的表达方式)也不起作用

<xsl:template match="//LienIntra">

在调试过程中我学到了很多东西,我可以这样说:

-内置模板没有问题,因为我在空白文件中测试过。

-问题似乎发生在我的代码的“SUBREGION Card Body Structure”部分,因为我一直在尝试对代码的每个部分进行注释,以查看导致匹配不起作用的位置和原因。

-我的直觉是我在选择器上做错了,或者我弄乱了模板中的模式(我尝试过使用和不使用模式),我非常感谢您提供的任何提示。

这是我的完整 XSL(您可以检查似乎发生问题的子区域 Card Body Structure 我可能错了):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" encoding="iso-8859-1" indent="no"/>
  <!-- Override built-in template -->
  <xsl:template match="text() | @*"/>
  <xsl:template match="/ | *" mode="general-content"/>
  <!-- -->
  <xsl:template match ="/">
    <html>
      <head>
        <title>
        </title>
        <script src="/js/jquery-3.1.1.slim.min.js">
        </script>
        <script src="/js/tether.min.js">
        </script>
        <link href="/css/bootstrap.min.css" rel="stylesheet" type="text/css"/>
        <script src="/js/bootstrap.min.js">
        </script>
        <script src="/js/fonctions.js">
        </script>
      </head>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>
  <!-- START-REGION: FilDAriane -->
  <xsl:template match="FilDAriane">
    <div id="fildariane">
      <ol class="breadcrumb">
        <xsl:apply-templates/>
      </ol>
    </div>
  </xsl:template>
  <xsl:template match="FilDAriane/Niveau">
    <li class="breadcrumb-item">
      <xsl:value-of select="."/>
    </li>
  </xsl:template>
  <!-- END-REGION: FilDAriane -->
  <!-- START-REGION: Introduction -->
  <xsl:template match="Publication/Introduction/Texte/Paragraphe">
    <div id="introduction">
      <xsl:value-of select="."/>
    </div>
  </xsl:template>
  <!-- END-REGION: Introduction -->
  <!-- START-REGION: Accordeon -->
  <!-- START-SUBREGION Accordeon et Card Header -->
  <xsl:template match="/Publication/Texte">
    <div id="accordion" role="tablist">
      <xsl:apply-templates/>
    </div>
  </xsl:template>
  <xsl:template match="/Publication/Texte/Chapitre">
    <div class="card">
      <div class="card-header" role="tab" id="heading{generate-id()}">
        <h5 class="mb-0">
          <a data-toggle="collapse" href="#collapse{generate-id()}" aria-expanded="true" aria-controls="collapse{}">
            <xsl:value-of select="Titre/Paragraphe"/>
          </a>
        </h5>
      </div>
      <div id="collapse{generate-id()}" class="collapse show" role="tabpanel" aria-labelledby="heading{generate-id()}" data-parent="#accordion">
        <div class="card-body">
          <xsl:choose>
            <xsl:when test="BlocCas">
              <xsl:apply-templates/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:apply-templates mode="general-content"/>
            </xsl:otherwise>
          </xsl:choose>
        </div>
      </div>
    </div>
  </xsl:template>
  <!-- END-SUBREGION Accordeon et Card Header-->
  <!-- START-SUBREGION Card Body Structure-->
  <xsl:template match="/Publication/Texte/Chapitre/BlocCas[@affichage='onglet']">
    <nav class="nav nav-tabs" id="tab{generate-id()}" role="tablist">
      <xsl:apply-templates mode="tab-title"/>
    </nav>
    <div class="tab-content" id="nav-tab{generate-id()}">
      <xsl:apply-templates mode="tab-pane"/>
    </div>
  </xsl:template>
  <xsl:template mode="tab-title" match="/Publication/Texte/Chapitre/BlocCas[@affichage='onglet']/Cas">
    <xsl:choose>
      <xsl:when test="position()=2">
        <a class="nav-item nav-link active" id="nav-tab{generate-id()}" data-toggle="tab" href="#nav{generate-id()}" role="tab" aria-controls="nav{generate-id()}" aria-selected="true">
          <xsl:value-of select="Titre/Paragraphe"/>
        </a>
      </xsl:when>
      <xsl:otherwise>
        <a class="nav-item nav-link" id="nav-tab{generate-id()}" data-toggle="tab" href="#nav{generate-id()}" role="tab" aria-controls="nav{generate-id()}" aria-selected="false">
          <xsl:value-of select="Titre/Paragraphe"/>
        </a>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  <xsl:template mode="tab-pane" match="/Publication/Texte/Chapitre/BlocCas[@affichage='onglet']/Cas">
    <xsl:choose>
      <xsl:when test="position()=2">
        <div class="tab-pane fade show active" id="nav{generate-id()}" role="tabpanel" aria-labelledby="nav-tab{generate-id()}">
          <xsl:apply-templates mode="general-content"/>
        </div>
      </xsl:when>
      <xsl:otherwise>
        <div class="tab-pane fade" id="nav{generate-id()}" role="tabpanel" aria-labelledby="nav-tab{generate-id()}">
          <xsl:apply-templates mode="general-content"/>
        </div>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  <!-- END-SUBREGION Card Body Structure-->
  <!-- START-SUBREGION Card Body Content -->
  <xsl:template mode="general-content" match="/Publication/Texte/Chapitre/BlocCas/Cas/Liste/Item/Paragraphe/LienIntra">
    TEST LINK TEST LINK TEST LINK
  </xsl:template>
  <xsl:template mode="general-content" match="/Publication/Texte/Chapitre/Paragraphe|/Publication/Texte/Chapitre/BlocCas/Cas/Paragraphe">
    <xsl:value-of select="./text()"/>
  </xsl:template>
  <xsl:template mode="general-content" match="/Publication/Texte/Chapitre/Liste[@type='puce']|/Publication/Texte/Chapitre/BlocCas/Cas/Liste[@type='puce']">
    <ul>
      <xsl:for-each select="Item">
        <li>
          <xsl:value-of select="Paragraphe/text()"/>
        </li>
      </xsl:for-each>
    </ul>
  </xsl:template>
  <xsl:template mode="general-content" match="/Publication/Texte/Chapitre/ANoter|/Publication/Texte/Chapitre/BlocCas/Cas/ANoter">
    <xsl:value-of select="Titre"/>
    <xsl:value-of select="Paragraphe/text()"/>
  </xsl:template>
  <xsl:template mode="general-content" match="/Publication/Texte/Chapitre/Attention|/Publication/Texte/Chapitre/BlocCas/Cas/Attention">
    <xsl:value-of select="Paragraphe/text()"/>
  </xsl:template>
  <!-- END-SUBREGION Card Body Content -->
  <!-- END-REGION: Accordeon -->
</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="F10505" type="Fiche d'information" xsi:noNamespaceSchemaLocation="../Schemas/3.0/Publication.xsd">
  <dc:title>Choix du nom de famille d'un enfant : nom de la mère, du père ou double-nom</dc:title>
  <dc:creator>Direction de l'information légale et administrative</dc:creator>
  <dc:subject>Papiers - Citoyenneté</dc:subject>
  <dc:description>Les parents peuvent choisir, sous certaines conditions, le nom que portera leur enfant. Une déclaration conjointe de choix de nom peut être faite avant ou après la déclaration de naissance. À défaut de choix, l’enfant porte le nom du parent dont la filiation est établie en premier ou celui du père en cas d’établissement simultané de la filiation.</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-03-21</dc:date>
  <dc:type>Fiche pratique</dc:type>
  <dc:format>text/xml</dc:format>
  <dc:identifier>F10505</dc:identifier>
  <dc:source>http://www.legifrance.gouv.fr/affichCode.do?idArticle=LEGIARTI000006424851&amp;idSectionTA=LEGISCTA000006150015&amp;cidTexte=LEGITEXT000006070721, http://circulaires.legifrance.gouv.fr/pdf/2011/11/cir_34124.pdf</dc:source>
  <dc:language>Fr</dc:language>
  <dc:relation>isPartOf N151</dc:relation>
  <dc:coverage>France entière</dc:coverage>
  <dc:rights>https://www.service-public.fr/a-propos/mentions-legales</dc:rights>
  <SurTitre>Fiche pratique</SurTitre>
  <Audience>Particuliers</Audience>
  <Canal>www.service-public.fr</Canal>
  <FilDAriane>
    <Niveau ID="Particuliers">Accueil particuliers</Niveau>
    <Niveau ID="N19810">Papiers - Citoyenneté</Niveau>
    <Niveau ID="N151">Nom et prénom</Niveau>
    <Niveau ID="F10505" type="Fiche d'information">Choix du nom de famille d'un enfant : nom de la mère, du père ou double-nom</Niveau>
  </FilDAriane>
  <Theme ID="N19810">
    <Titre>Papiers - Citoyenneté</Titre>
  </Theme>
  <SousThemePere ID="N103">État civil - Identité - Authentification</SousThemePere>
  <DossierPere ID="N151">
    <Titre>Nom et prénom</Titre>
    <SousDossier ID="N151-1">
      <Titre>Nom de famille</Titre>
      <Fiche ID="F10505">Choix du nom de l'enfant à sa naissance : mère, père ou double-nom</Fiche>
      <Fiche ID="F10506">Changement du nom de l'enfant après sa naissance</Fiche>
      <Fiche ID="F1656">Changement de nom pour motif légitime</Fiche>
    </SousDossier>
    <SousDossier ID="N151-2">
      <Titre>Prénom</Titre>
      <Fiche ID="F882">Choix du prénom de l'enfant</Fiche>
      <Fiche ID="F885">Changement de prénom</Fiche>
    </SousDossier>
    <SousDossier ID="N151-3">
      <Titre>Nom d'usage</Titre>
      <Fiche ID="F868">Utilisation du nom de son mari ou de sa femme</Fiche>
      <Fiche ID="F1343">Utilisation du nom des deux parents</Fiche>
    </SousDossier>
    <SousDossier ID="N151-4">
      <Titre>Adoption</Titre>
      <Fiche ID="F2668">Nom de famille et adoption plénière</Fiche>
      <Fiche ID="F2621">Nom de famille et adoption simple</Fiche>
    </SousDossier>
  </DossierPere>
  <SousDossierPere>Nom de famille</SousDossierPere>
  <Introduction>
    <Texte>
      <Paragraphe>Les parents peuvent choisir, sous certaines conditions, le nom que portera leur enfant. 			Une déclaration conjointe de choix de nom peut être faite avant ou après la déclaration de naissance. 			À défaut de choix, l’enfant porte le nom du parent dont la filiation est établie en premier ou celui du père en cas d’établissement simultané de la filiation.</Paragraphe>
    </Texte>
  </Introduction>
  <Texte>
    <Chapitre>
      <Titre>
        <Paragraphe>Quel nom peut-on donner à son enfant ?</Paragraphe>
      </Titre>
      <BlocCas affichage="onglet">
        <Cas>
          <Titre>
            <Paragraphe>Cas général</Paragraphe>
          </Titre>
          <Paragraphe>Un enfant dont la filiation est établie à l'égard de chacun des parents, peut porter : </Paragraphe>
          <Liste type="puce">
            <Item>
              <Paragraphe>soit le nom du père ;</Paragraphe>
            </Item>
            <Item>
              <Paragraphe>soit le nom de la mère ;</Paragraphe>
            </Item>
            <Item>
              <Paragraphe>soit les 2 noms accolés, séparés par un simple espace, dans un ordre choisi par eux et dans la limite d'un seul <LienIntra LienID="R10114" type="Définition de glossaire">nom de famille</LienIntra> pour chacun s'ils portent eux-mêmes le nom de leurs 2 parents.</Paragraphe>
            </Item>
          </Liste>
          <Paragraphe>Exemple : si le nom du père est Dupond Durand et la mère Dupuis, l'enfant pourra porter le nom de Dupond Dupuis.</Paragraphe>
          <ANoter>
            <Titre>À noter</Titre>
            <Paragraphe>un  nom composé existant avant 2005 constitue un nom unique, qui est indissociable et est donc transmis intégralement. Un nom composé suite à une <LienInterne LienPublication="F2621" type="Fiche d'information" audience="Particuliers">adoption simple</LienInterne>, quel que soit l'âge de l'adopté, est également indissociable et transmis intégralement.</Paragraphe>
          </ANoter>
        </Cas>
        <Cas>
          <Titre>
            <Paragraphe>L'un des parents est étranger</Paragraphe>
          </Titre>
          <Paragraphe>Un enfant dont la filiation est établie à l'égard de chacun des parents, peut porter : </Paragraphe>
          <Liste type="puce">
            <Item>
              <Paragraphe>soit le nom du père ;</Paragraphe>
            </Item>
            <Item>
              <Paragraphe>soit le nom de la mère ;</Paragraphe>
            </Item>
            <Item>
              <Paragraphe>soit les 2 noms accolés, séparés par un simple espace, dans un ordre choisi par eux et dans la limite d'un seul <LienIntra LienID="R10114" type="Définition de glossaire">nom de famille</LienIntra> pour chacun s'ils portent eux-mêmes le nom de leurs 2 parents</Paragraphe>
            </Item>
          </Liste>
          <Attention>
            <Titre>Attention</Titre>
            <Paragraphe>si le nom du ou des parents étrangers est constitué de plusieurs termes, il est considéré comme indivisible. Pour diviser le nom et n'en transmettre qu'une partie, vous devez produire un certificat de coutume.</Paragraphe>
          </Attention>
        </Cas>
      </BlocCas>
    </Chapitre>
    <Chapitre>
      <Titre>
        <Paragraphe>Comment choisir le nom de l'enfant ?</Paragraphe>
      </Titre>
      <Paragraphe>Le choix du nom de famille s'effectue par  le formulaire cerfa n°15286*01.	Il s'agit d’un seul document signé à la même date par les père et mère, remis à l'officier de l'état civil avec la <LienInterne LienPublication="F961" type="Fiche d'information" audience="Particuliers">déclaration de naissance</LienInterne>. </Paragraphe>
      <ServiceEnLigne ID="R32739" URL="https://www.formulaires.modernisation.gouv.fr/gf/cerfa_15286.do" format="application/pdf" poids="197.1 KB" numerocerfa="15286*01" type="Formulaire">
        <Titre>Déclaration conjointe de choix de nom</Titre>
        <Source ID="R30663">Ministère chargé de la justice</Source>
        <Introduction>
          <Texte>
            <Paragraphe>Permet aux parents de déclarer le nom de famille choisi pour leur enfant.</Paragraphe>
          </Texte>
        </Introduction>
      </ServiceEnLigne>
      <Paragraphe>Si le couple a déjà un enfant né avant 2005, le choix de nom est possible pour le plus jeune, sous certaines conditions, seulement si l'aîné des enfants n'a pas fait l'objet d'une déclaration d'ajout de nom ou de déclaration conjointe de changement de nom.</Paragraphe>
      <Paragraphe>Si le couple a déjà un enfant né après le 1<Exposant>er</Exposant> janvier 2005, le choix de nom est possible pour le plus jeune :</Paragraphe>
      <Liste type="puce">
        <Item>
          <Paragraphe>si la filiation de l'aîné ne permettait pas une déclaration de choix de nom ;</Paragraphe>
        </Item>
        <Item>
          <Paragraphe>et qu'aucune déclaration de changement de nom n'a été faite ultérieurement.</Paragraphe>
        </Item>
      </Liste>
    </Chapitre>
    <Chapitre>
      <Titre>
        <Paragraphe>Quel nom en l'absence de choix des parents ?</Paragraphe>
      </Titre>
      <BlocCas affichage="radio">
        <Cas>
          <Titre>
            <Paragraphe>Les parents sont mariés ensemble</Paragraphe>
          </Titre>
          <Paragraphe>En l'absence de déclaration conjointe de choix de nom, l'enfant  prend 			le nom du père.</Paragraphe>
          <Paragraphe>L'absence de choix équivaut à un choix et s'impose aux autres enfants.</Paragraphe>
        </Cas>
        <Cas>
          <Titre>
            <Paragraphe>Les parents ne sont pas mariés ensemble</Paragraphe>
          </Titre>
          <Paragraphe>En l'absence de déclaration conjointe de choix de nom, l'enfant prend le nom de celui de ses parents à l'égard duquel sa filiation est établie en premier.</Paragraphe>
          <Paragraphe>Par exemple, si le père reconnaît l'enfant après la déclaration de naissance, l'enfant prend le nom de sa mère.</Paragraphe>
          <Paragraphe>Si la filiation est établie simultanément entre les deux parents, l'enfant prend le nom du père.</Paragraphe>
          <Paragraphe>L'absence de choix équivaut à un choix et s'impose aux autres enfants.</Paragraphe>
          <ANoter>
            <Titre>À noter</Titre>
            <Paragraphe>en  cas de <LienInterne LienPublication="F10555" type="Fiche Question-réponse" audience="Particuliers">désaccord entre les parents</LienInterne>,  l'enfant prend  le nom des deux parents accolés selon l'ordre alphabétique.</Paragraphe>
          </ANoter>
        </Cas>
      </BlocCas>
    </Chapitre>
    <Chapitre>
      <Titre>
        <Paragraphe>Quels sont les effets du choix du nom ?</Paragraphe>
      </Titre>
      <Paragraphe>Le choix effectué pour l'aîné s'impose aux enfants plus jeunes du couple. Pour cela, leur filiation doit avoir été établie à l'égard des deux parents à la date de la déclaration de naissance.</Paragraphe>
      <Paragraphe>Le choix du nom est définitif.</Paragraphe>
    </Chapitre>
  </Texte>
  <VoirAussi important="non">
    <Fiche ID="F2668" audience="Particuliers">
      <Titre>Adoption plénière : conséquence sur le nom de famille</Titre>
      <Theme ID="N19810">
        <Titre>Papiers - Citoyenneté</Titre>
      </Theme>
    </Fiche>
    <Fiche ID="F2621" audience="Particuliers">
      <Titre>Adoption simple : conséquence sur le nom de famille</Titre>
      <Theme ID="N19810">
        <Titre>Papiers - Citoyenneté</Titre>
      </Theme>
    </Fiche>
  </VoirAussi>
  <OuSAdresser ID="R1" type="Local personnalisé sur SP">
    <Titre>Mairie</Titre>
    <Complement>Pour établir la déclaration de choix de nom</Complement>
    <PivotLocal>mairie</PivotLocal>
    <RessourceWeb URL="https://lannuaire.service-public.fr/"/>
    <Source ID="R30601">Service-public.fr</Source>
  </OuSAdresser>
  <Reference type="Texte de référence" URL="http://www.legifrance.gouv.fr/affichCode.do?idArticle=LEGIARTI000006424851&amp;idSectionTA=LEGISCTA000006150015&amp;cidTexte=LEGITEXT000006070721" ID="R12161">
    <Titre>Code civil : article 311-21 à 311-24</Titre>
    <Complement>Choix du nom de famille pour un enfant</Complement>
  </Reference>
  <Reference type="Texte de référence" URL="http://circulaires.legifrance.gouv.fr/pdf/2011/11/cir_34124.pdf" ID="R2316" format="application/pdf" poids="1.0 MB">
    <Titre>Circulaire du 28 octobre 2011 portant sur divers actes de l'état civil relatifs à la naissance et à la filiation</Titre>
  </Reference>
  <ServiceEnLigne ID="R32739" URL="https://www.formulaires.modernisation.gouv.fr/gf/cerfa_15286.do" format="application/pdf" poids="197.1 KB" numerocerfa="15286*01" type="Formulaire">
    <Titre>Déclaration conjointe de choix de nom</Titre>
    <Source ID="R30663">Ministère chargé de la justice</Source>
  </ServiceEnLigne>
  <Definition ID="R10114">
    <Titre>Nom de famille</Titre>
    <Texte>
      <Paragraphe>Nom qui figure sur l'acte de naissance (appelé aussi <Expression>nom de naissance</Expression> ou <Expression>nom patronymique</Expression>)</Paragraphe>
    </Texte>
  </Definition>
  <QuestionReponse ID="F10555" audience="Particuliers">Quel nom de famille pour un enfant en cas de désaccord entre les parents ?</QuestionReponse>
</Publication>

【问题讨论】:

    标签: xml parsing xslt xpath


    【解决方案1】:

    问题不在于模板匹配本身,而是与不继续处理的Lientra 节点的祖先匹配的其他模板

    首先你有这个模板匹配

    <xsl:template mode="general-content" match="/Publication/Texte/Chapitre/Liste[@type='puce']|/Publication/Texte/Chapitre/BlocCas/Cas/Liste[@type='puce']">
    <ul>
      <xsl:for-each select="Item">
        <li>
          <xsl:value-of select="Paragraphe/text()"/>
        </li>
      </xsl:for-each>
    </ul>
    </xsl:template>
    

    在这种情况下,模板匹配 /Publication/Texte/Chapitre/BlocCas/Cas/Liste[@type='puce'] 正在使用(如在您的 XML 中,所有 Liste 元素都有 type 的“puce”)。该模板不会在任何地方使用xsl:apply-templates,因此不会从此时开始处理任何后代节点。

    如果您要在此处输入xsl:apply-templates,则此模板会出现问题

    <xsl:template match="/ | *" mode="general-content"/>  
    

    这将用于匹配Liste 下的Item,因为您没有更具体的模板匹配Item。同样,此时处理将停止。

    我无法给出准确的解决方案,因为我不知道您要达到的具体目标,但一般建议是检查与您当前路径中的祖先相匹配的模板,并确保它们按要求继续处理.

    【讨论】:

    • 谢谢,您已经回答了我之前的一个几乎相同主题的问题。我认为 XSLT 会独立于任何 处理所有节点,但我想这是我覆盖的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多