首页 > 解决方案 > 为什么我的模板不起作用?只有空行

问题描述

我从事 NLP 项目,我需要修改这种 xml 文件:

<item number="1">
<titre><article>
<element><data type="type">PRO:DEM</data><data type="lemma">ce</data><data type="string">Ce</data></element>
<element><data type="type">PRO:REL</data><data type="lemma">que</data><data type="string">que</data></element>
<element><data type="type">NOM</data><data type="lemma">l’on</data><data type="string">l’on</data></element>
<element><data type="type">VER:pres</data><data type="lemma">savoir</data><data type="string">sait</data></element>
<element><data type="type">PRP</data><data type="lemma">de</data><data type="string">de</data></element>
<element><data type="type">NOM</data><data type="lemma">l’attentat</data><data type="string">l’attentat</data></element>
<element><data type="type">PRP:det</data><data type="lemma">du</data><data type="string">du</data></element>
<element><data type="type">NAM</data><data type="lemma">Nouvel</data><data type="string">Nouvel</data></element>
<element><data type="type">NAM</data><data type="lemma">An</data><data type="string">An</data></element>
<element><data type="type">PRP</data><data type="lemma">dans</data><data type="string">dans</data></element>
<element><data type="type">DET:ART</data><data type="lemma">un</data><data type="string">un</data></element>
<element><data type="type">NOM</data><data type="lemma">club</data><data type="string">club</data></element>
<element><data type="type">ADJ</data><data type="lemma">d’Istanbul</data><data type="string">d’Istanbul</data></element>
<element><data type="type">SENT</data><data type="lemma">.</data><data type="string">.</data></element>
</article>
</titre>
<description><article>
<element><data type="type">PRP</data><data type="lemma">en</data><data type="string">En</data></element>
<element><data type="type">NAM</data><data type="lemma">Turquie</data><data type="string">Turquie</data></element>
<element><data type="type">PUN</data><data type="lemma">,</data><data type="string">,</data></element>
<element><data type="type">DET:ART</data><data type="lemma">un</data><data type="string">une</data></element>
<element><data type="type">ADJ</data><data type="lemma">célèbre</data><data type="string">célèbre</data></element>
<element><data type="type">NOM</data><data type="lemma">boîte</data><data type="string">boîte</data></element>
<element><data type="type">PRP</data><data type="lemma">de</data><data type="string">de</data></element>
<element><data type="type">NOM</data><data type="lemma">nuit</data><data type="string">nuit</data></element>
<element><data type="type">VER:pres</data><data type="lemma">avoir</data><data type="string">a</data></element>
<element><data type="type">VER:pper</data><data type="lemma">être</data><data type="string">été</data></element>
<element><data type="type">VER:pper</data><data type="lemma">viser</data><data type="string">visée</data></element>
<element><data type="type">PRP</data><data type="lemma">dans</data><data type="string">dans</data></element>
<element><data type="type">DET:ART</data><data type="lemma">le</data><data type="string">la</data></element>
<element><data type="type">NOM</data><data type="lemma">nuit</data><data type="string">nuit</data></element>
<element><data type="type">PRP</data><data type="lemma">par</data><data type="string">par</data></element>
<element><data type="type">DET:ART</data><data type="lemma">un</data><data type="string">un</data></element>
<element><data type="type">NOM</data><data type="lemma">attentat</data><data type="string">attentat</data></element>
<element><data type="type">PRO:REL</data><data type="lemma">qui</data><data type="string">qui</data></element>
<element><data type="type">VER:pres</data><data type="lemma">avoir</data><data type="string">a</data></element>
<element><data type="type">VER:pper</data><data type="lemma">faire</data><data type="string">fait</data></element>
<element><data type="type">PRP:det</data><data type="lemma">au</data><data type="string">au</data></element>
<element><data type="type">ADV</data><data type="lemma">moins</data><data type="string">moins</data></element>
<element><data type="type">NUM</data><data type="lemma">@card@</data><data type="string">39</data></element>
<element><data type="type">NOM</data><data type="lemma">mort</data><data type="string">morts</data></element>
<element><data type="type">SENT</data><data type="lemma">.</data><data type="string">.</data></element>
<element><data type="type">NAM</data><data type="lemma">L’assaillant</data><data type="string">L’assaillant</data></element>
<element><data type="type">VER:pres</data><data type="lemma">être</data><data type="string">est</data></element>
<element><data type="type">ADV</data><data type="lemma">toujours</data><data type="string">toujours</data></element>
<element><data type="type">VER:pper</data><data type="lemma">rechercher</data><data type="string">recherché</data></element>
<element><data type="type">SENT</data><data type="lemma">.</data><data type="string">.</data></element>
</article>
</description>
</item>
<item number="2">
<titre><article>
<element><data type="type">NOM</data><data type="lemma">tiers</data><data type="string">Tiers</data></element>
<element><data type="type">ADJ</data><data type="lemma">payant</data><data type="string">payant</data></element>
<element><data type="type">PUN</data><data type="lemma">,</data><data type="string">,</data></element>
<element><data type="type">NOM</data><data type="lemma">paquet</data><data type="string">paquet</data></element>
<element><data type="type">ADJ</data><data type="lemma">neutre</data><data type="string">neutre</data></element>
<element><data type="type">PUN</data><data type="lemma">,</data><data type="string">,</data></element>
<element><data type="type">VER:pres</data><data type="lemma">divorcer</data><data type="string">divorce</data></element>
<element><data type="type">NOM</data><data type="lemma">…&lt;/data><data type="string">…&lt;/data></element>
<element><data type="type">PRO:DEM</data><data type="lemma">ce</data><data type="string">ce</data></element>
<element><data type="type">PRO:REL</data><data type="lemma">qui</data><data type="string">qui</data></element>
<element><data type="type">VER:pres</data><data type="lemma">changer</data><data type="string">change</data></element>
<element><data type="type">PRP</data><data type="lemma">en</data><data type="string">en</data></element>
<element><data type="type">NOM</data><data type="lemma">janvier</data><data type="string">janvier</data></element>
<element><data type="type">SENT</data><data type="lemma">@ord@</data><data type="string">2017.</data></element>
</article>
</titre>
<description><article>
<element><data type="type">DET:ART</data><data type="lemma">le</data><data type="string">La</data></element>
<element><data type="type">ADJ</data><data type="lemma">nouveau</data><data type="string">nouvelle</data></element>
<element><data type="type">NOM</data><data type="lemma">année</data><data type="string">année</data></element>
<element><data type="type">VER:pres</data><data type="lemma">annoncer</data><data type="string">annonce</data></element>
<element><data type="type">VER:pper</data><data type="lemma">l’entrée</data><data type="string">l’entrée</data></element>
<element><data type="type">PRP</data><data type="lemma">en</data><data type="string">en</data></element>
<element><data type="type">NOM</data><data type="lemma">vigueur</data><data type="string">vigueur</data></element>
<element><data type="type">PRP</data><data type="lemma">de</data><data type="string">de</data></element>
<element><data type="type">ADJ</data><data type="lemma">nouveau</data><data type="string">nouvelles</data></element>
<element><data type="type">NOM</data><data type="lemma">réforme</data><data type="string">réformes</data></element>
<element><data type="type">SENT</data><data type="lemma">.</data><data type="string">.</data></element>
<element><data type="type">NOM</data><data type="lemma">précision</data><data type="string">Précisions</data></element>
<element><data type="type">PRP</data><data type="lemma">sur</data><data type="string">sur</data></element>
<element><data type="type">DET:ART</data><data type="lemma">le</data><data type="string">les</data></element>
<element><data type="type">NOM</data><data type="lemma">mesure</data><data type="string">mesures</data></element>
<element><data type="type">DET:ART</data><data type="lemma">le</data><data type="string">les</data></element>
<element><data type="type">ADV</data><data type="lemma">plus</data><data type="string">plus</data></element>
<element><data type="type">ADJ</data><data type="lemma">important</data><data type="string">importantes</data></element>
<element><data type="type">PRP</data><data type="lemma">de</data><data type="string">de</data></element>
<element><data type="type">DET:POS</data><data type="lemma">@ord@</data><data type="string">2017.</data></element>
</article>
</description>
</item>
<item number="3">
<titre><article>
<element><data type="type">NUM</data><data type="lemma">@card@</data><data type="string">2016</data></element>
<element><data type="type">PUN</data><data type="lemma">:</data><data type="string">:</data></element>
<element><data type="type">ADJ</data><data type="lemma">l’année</data><data type="string">l’année</data></element>
<element><data type="type">PRO:REL</data><data type="lemma">où</data><data type="string">où</data></element>
<element><data type="type">DET:ART</data><data type="lemma">le</data><data type="string">le</data></element>
<element><data type="type">NOM</data><data type="lemma">libre-échange</data><data type="string">libre-échange</data></element>
<element><data type="type">VER:pres</data><data type="lemma">avoir</data><data type="string">a</data></element>
<element><data type="type">VER:pper</data><data type="lemma">vaciller</data><data type="string">vacillé</data></element>
<element><data type="type">SENT</data><data type="lemma">.</data><data type="string">.</data></element>
</article>
</titre>
<description><article>
<element><data type="type">NAM</data><data type="lemma">CETA</data><data type="string">CETA</data></element>
<element><data type="type">PUN</data><data type="lemma">,</data><data type="string">,</data></element>
<element><data type="type">NAM</data><data type="lemma">TPP</data><data type="string">TPP</data></element>
<element><data type="type">PUN</data><data type="lemma">,</data><data type="string">,</data></element>
<element><data type="type">NAM</data><data type="lemma">Tafta</data><data type="string">Tafta</data></element>
<element><data type="type">PUN</data><data type="lemma">...</data><data type="string">...</data></element>
<element><data type="type">NUM</data><data type="lemma">@card@</data><data type="string">2016</data></element>
<element><data type="type">VER:pres</data><data type="lemma">avoir</data><data type="string">a</data></element>
<element><data type="type">VER:pper</data><data type="lemma">porter</data><data type="string">porté</data></element>
<element><data type="type">PRP:det</data><data type="lemma">au</data><data type="string">au</data></element>
<element><data type="type">NOM</data><data type="lemma">libre-échange</data><data type="string">libre-échange</data></element>
<element><data type="type">DET:ART</data><data type="lemma">un</data><data type="string">un</data></element>
<element><data type="type">NOM</data><data type="lemma">coup</data><data type="string">coup</data></element>
<element><data type="type">PRO:REL</data><data type="lemma">dont</data><data type="string">dont</data></element>
<element><data type="type">PRO:PER</data><data type="lemma">il</data><data type="string">il</data></element>
<element><data type="type">VER:cond</data><data type="lemma">pouvoir</data><data type="string">pourrait</data></element>
<element><data type="type">VER:infi</data><data type="lemma">garder</data><data type="string">garder</data></element>
<element><data type="type">PRP</data><data type="lemma">pour</data><data type="string">pour</data></element>
<element><data type="type">ADV</data><data type="lemma">longtemps</data><data type="string">longtemps</data></element>
<element><data type="type">PRP:det</data><data type="lemma">du</data><data type="string">des</data></element>
<element><data type="type">NOM</data><data type="lemma">séquelle</data><data type="string">séquelles</data></element>
<element><data type="type">SENT</data><data type="lemma">.</data><data type="string">.</data></element>
</article>
</description>
</item>

我的匹配 //data 的模板有效,但不打印任何内容。只有带有 HTML 应答器的空字段。这是我的代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:myNS="http://devedge.netscape.com/2002/de">
    <xsl:output method="html"/>

<xsl:template match="/">
  
  <html>
    <body>      
    <xsl:apply-templates/>
    </body>
  </html>
        
</xsl:template>   

 <xsl:template match="//item">
  <p>
   <xsl:for-each select="//element">
       <xsl:apply-templates/>
   </xsl:for-each>
 </p><br />      
</xsl:template>

<xsl:template match="//data">    
    <xsl:choose>
        <xsl:when test="data[@type='type']='NOM' or data[@type='type']='ADJ'">
            <b><font color="yellow"><xsl:value-of select="data[@type='string']/text()"/></font></b>
            <font color="blue"><xsl:value-of select="data[@type='lemma']/text()"/></font>
            <i><font color="green"><xsl:value-of select="data[@type='type']/text()"/></font></i>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="data[@type='string']/text()"/>
            <font color="blue"><xsl:value-of select="data[@type='lemma']/text()"/></font>
            <i><font color="green"><xsl:value-of select="data[@type='type']/text()"/></font></i>
        </xsl:otherwise>
   </xsl:choose>
</xsl:template>

</xsl:stylesheet>

谢谢你帮助我。再一次,我只想逐行输出一个模式的文本。我不能在这里做 LF 但 np. 这并不难理解。以下是 DET NOM ADJ 类型的单词按此顺序排列,中间没有其他单词。

标签: xmltemplatesxsltxpath

解决方案


我终于找到了答案。我的原始代码很丑陋。我可以使用正确的 xpaths 路径应用正确的模板。

<?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="utf-8"/>
<xsl:variable name="var"></xsl:variable>

<xsl:template match="/">
 <xsl:text disable-output-escaping='yes'>&lt;!DOCTYPE html&gt;</xsl:text>
    <xsl:text>
    </xsl:text>
  <html>
    <body>
        <xsl:apply-templates/>
    </body>
  </html>       
</xsl:template>   

 <xsl:template match="article">
     
  <p><xsl:apply-templates/></p>
     
</xsl:template>

<xsl:template match="element">
    <xsl:choose>
        <xsl:when test="(./data[contains(text(),'DET')]) and (following-sibling::element[1][./data[contains(text(),'NOM')]]) or (./data[contains(text(),'NOM')]) and (preceding-sibling::element[1][./data[contains(text(),'DET')]])">
            <b><font color="red"><xsl:value-of select="./data[@type='string']/text()"/></font></b>
            <font color="blue"><xsl:value-of select="./data[@type='lemma']/text()"/></font>
            <i><font color="red"><xsl:value-of select="./data[@type='type']/text()"/></font></i>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="data[@type='string']/text()"/>
            <font color="blue"><xsl:value-of select="data[@type='lemma']/text()"/></font>
            <i><font color="green"><xsl:value-of select="data[@type='type']/text()"/></font></i>
        </xsl:otherwise>
   </xsl:choose>
</xsl:template>

</xsl:stylesheet>

推荐阅读