首页 > 解决方案 > 挣扎于节点列表和模板

问题描述

又是我,但这次我的问题很有趣。我在一个 NLP 项目上工作,我需要提取句法依赖项。之前检查我的xml文件。它会更清楚。

<items>
<item type="forme" pos="86"><f>et</f><c>J</c><l>et</l><a>B</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>ROOT</a><a>ROOT</a><a>-</a><a>-</a><a>-</a><a>-</a><a>O</a><a>B</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>B</a><a>W</a><a>_</a><a>-</a><a>89.635342168126</a><a>91.64462185594235</a><a>U</a><a>U_mm</a><a>mm</a><a>433.8949999999997</a><a>613.0525000000002</a><a>$L1</a><a>-</a><a>I</a><a>-</a><a>hl</a><a>U</a><a>U_mm</a><a>motherless_mm</a><a>motherless</a><a>mm</a><a>U</a><a>U_mm</a><a>U_weak_mm</a><a>weak</a><a>mm</a><a>U</a><a>U_weak</a><a>U_weak_mm</a><a>weak</a><a>mm</a><a>16.864728</a><a>17.298623</a><a>(IU:B)_(PER:I)_(PAQ:U)_(GR:U)</a><a>(ASNUC:O)_(PER:I)</a><a>(PRN:O)_(PER:I)</a><a>(PON:O)_(PAQ:U)_(PER:I)_(GR:U)</a></item>
<item type="delim" pos="87"><f> </f><c>BLANK</c><l>BLANK</l><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a></item>
<item type="forme" pos="88"><f>je</f><c>Cl</c><l>je</l><a>B</a><a>-</a><a>-</a><a>1</a><a>sg</a><a>-</a><a>PARA_DISFL(92)</a><a>-</a><a>-</a><a>PARA_DISFL(92)</a><a>SUB_INHERITED(94)</a><a>-</a><a>U</a><a>I</a><a>B</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>0</a><a>0</a><a>H</a><a>89.78229983184981</a><a>90.9450769686341</a><a>U</a><a>U_ml</a><a>ml</a><a>559.0779999999995</a><a>446.97400000000084</a><a>$L1</a><a>-</a><a>I</a><a>-</a><a>hl</a><a>B</a><a>B_mhL2</a><a>lone-dis-strong_mhL2</a><a>lone-dis-strong</a><a>mhL2</a><a>B</a><a>B_mhL2</a><a>B_dis-strong_mhL2</a><a>dis-strong</a><a>mhL2</a><a>B</a><a>B_dis-strong</a><a>B_dis-strong_mhL2</a><a>dis-strong</a><a>mhL2</a><a>17.298623</a><a>17.857701</a><a>(IU:I)_(PER:I)_(PAQ:B)_(GR:B)</a><a>(ASNUC:O)_(PER:I)</a><a>(PRN:O)_(PER:I)</a><a>(PON:O)_(PAQ:B)_(PER:I)_(GR:B)</a></item>
<item type="delim" pos="89"><f> </f><c>BLANK</c><l>BLANK</l><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a></item>
<item type="forme" pos="90"><f>euh</f><c>I</c><l>euh</l><a>B</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>ROOT</a><a>ROOT</a><a>-</a><a>-</a><a>-</a><a>-</a><a>B</a><a>I</a><a>I</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>U</a><a>O</a><a>0</a><a>0</a><a>H</a><a>91.0917299634017</a><a>88.32560736761792</a><a>U</a><a>U_mL</a><a>mL</a><a>667.027000000001</a><a>365.74324999999953</a><a>$L1</a><a>-</a><a>I</a><a>-</a><a>hl</a><a>I</a><a>-</a><a>-</a><a>lone-dis-strong</a><a>mhL2</a><a>I</a><a>-</a><a>-</a><a>dis-strong</a><a>mhL2</a><a>I</a><a>-</a><a>-</a><a>dis-strong</a><a>mhL2</a><a>17.857701</a><a>18.524728</a><a>(IU:I)_(PER:I)_(PAQ:I)_(GR:I)</a><a>(ASNUC:U)_(PER:I)</a><a>(PRN:O)_(PER:I)</a><a>(PON:O)_(PAQ:I)_(PER:I)_(GR:I)</a></item>
<item type="delim" pos="91"><f> </f><c>BLANK</c><l>BLANK</l><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a></item>
<item type="forme" pos="92"><f>je</f><c>Cl</c><l>je</l><a>B</a><a>-</a><a>-</a><a>1</a><a>sg</a><a>-</a><a>SUB(94)</a><a>SUB(94)</a><a>-</a><a>-</a><a>-</a><a>-</a><a>L</a><a>I</a><a>I</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>0</a><a>0</a><a>-</a><a>90.76577375975249</a><a>89.37667027198918</a><a>U</a><a>U_mhl2</a><a>mhl2</a><a>240.000000000002</a><a>436.54499999999973</a><a>$L1</a><a>-</a><a>I</a><a>-</a><a>hl</a><a>I</a><a>-</a><a>-</a><a>lone-dis-strong</a><a>mhL2</a><a>I</a><a>-</a><a>-</a><a>dis-strong</a><a>mhL2</a><a>I</a><a>-</a><a>-</a><a>dis-strong</a><a>mhL2</a><a>18.524728</a><a>18.764728</a><a>(IU:I)_(PER:I)_(PAQ:I)_(GR:I)</a><a>(ASNUC:O)_(PER:I)</a><a>(PRN:O)_(PER:I)</a><a>(PON:O)_(PAQ:I)_(PER:I)_(GR:I)</a></item>
<item type="delim" pos="93"><f> </f><c>BLANK</c><l>BLANK</l><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a></item>
<item type="forme" pos="94"><f>continue</f><c>V</c><l>continuer</l><a>B</a><a>indicative</a><a>present</a><a>1</a><a>sg</a><a>-</a><a>DEP(86)</a><a>DEP(86)</a><a>-</a><a>-</a><a>-</a><a>-</a><a>L</a><a>I</a><a>I</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>S</a><a>0</a><a>H</a><a>92.42666896088915</a><a>93.38822556873673</a><a>U</a><a>U_mh</a><a>mh</a><a>653.0169999999985</a><a>200.0187499999999</a><a>$L1</a><a>-</a><a>I</a><a>-</a><a>hl</a><a>L</a><a>-</a><a>-</a><a>lone-dis-strong</a><a>mhL2</a><a>L</a><a>-</a><a>-</a><a>dis-strong</a><a>mhL2</a><a>L</a><a>-</a><a>-</a><a>dis-strong</a><a>mhL2</a><a>18.764728</a><a>19.93782</a><a>(IU:I)_(PER:I)_(PAQ:L)_(GR:L)</a><a>(ASNUC:O)_(PER:I)</a><a>(PRN:O)_(PER:I)</a><a>(PON:O)_(PAQ:L)_(PER:I)_(GR:L)</a></item>
<item type="delim" pos="95"><f> </f><c>BLANK</c><l>BLANK</l><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a></item>
<item type="forme" pos="96"><f>je</f><c>Cl</c><l>je</l><a>B</a><a>-</a><a>-</a><a>1</a><a>sg</a><a>-</a><a>SUB(98)</a><a>SUB(98)</a><a>-</a><a>-</a><a>-</a><a>-</a><a>B</a><a>I</a><a>I</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>0</a><a>0</a><a>-</a><a>92.31503521460044</a><a>93.43435942977976</a><a>U</a><a>U_hm</a><a>hm</a><a>80.00000000000185</a><a>318.27299999999957</a><a>$L1</a><a>-</a><a>I</a><a>-</a><a>hl</a><a>B</a><a>B_hh</a><a>lone_hh</a><a>lone</a><a>hh</a><a>B</a><a>B_hh</a><a>B_strong_hh</a><a>strong</a><a>hh</a><a>B</a><a>B_strong</a><a>B_strong_hh</a><a>strong</a><a>hh</a><a>19.93782</a><a>20.01782</a><a>(IU:I)_(PER:I)_(PAQ:B)_(GR:B)</a><a>(ASNUC:O)_(PER:I)</a><a>(PRN:O)_(PER:I)</a><a>(PON:O)_(PAQ:B)_(PER:I)_(GR:B)</a></item>
<item type="delim" pos="97"><f> </f><c>BLANK</c><l>BLANK</l><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a></item>
<item type="forme" pos="98"><f>continue</f><c>V</c><l>continuer</l><a>B</a><a>indicative</a><a>present</a><a>1</a><a>sg</a><a>-</a><a>PARA_DISFL(94)</a><a>-</a><a>-</a><a>PARA_DISFL(94)</a><a>DEP_INHERITED(86)</a><a>-</a><a>L</a><a>I</a><a>I</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>O</a><a>S</a><a>0</a><a>-</a><a>92.48276610196193</a><a>92.52747870666991</a><a>U</a><a>U_mh</a><a>mh</a><a>297.8790000000018</a><a>289.99999999999915</a><a>$L1</a><a>-</a><a>I</a><a>-</a><a>hl</a><a>L</a><a>-</a><a>-</a><a>lone</a><a>hh</a><a>L</a><a>-</a><a>-</a><a>strong</a><a>hh</a><a>L</a><a>-</a><a>-</a><a>strong</a><a>hh</a><a>20.01782</a><a>20.645699</a><a>(IU:I)_(PER:I)_(PAQ:L)_(GR:L)</a><a>(ASNUC:O)_(PER:I)</a><a>(PRN:O)_(PER:I)</a><a>(PON:O)_(PAQ:L)_(PER:I)_(GR:L)</a></item>
<item type="delim" pos="99"><f> </f><c>BLANK</c><l>BLANK</l><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a><a>-</a></item>

我的任务是捕获所有带有 [7] 包含 (SUB) 的项目。你可以看到有一个数字。它与项目(pos)的属性相匹配,我需要抓住它。我确切地说我必须有单词的形式(它是 f 节点)。但最重要的是,当我设法抓住我的两个词(pos 上的 SUB 一个)时,我需要对它们进行排序。我必须计算单词,检查最频繁的世界,按类别排序(它是 c 个节点)。问题是我必须使用我的 2 个项目节点,而所有其他我会找到它。但我很难管理节点。例如这里,具有 pos 属性 92 的项目具有 [7] = SUB,我需要获取具有属性 pos = 94 的项目,因为它是 SUB(94)。所以在这里我必须抓住“je”和“继续”这个词。这是我的代码:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
    xmlns:exsl="http://exslt.org/common">
    <xsl:output method="text" encoding="UTF-8"/>
    
      
    <xsl:template match="/">

        (; i need a variable here to grab the items nodes, all my items from the xsl:template match="item :)
        <xsl:apply-templates select="//item"/>
        
    </xsl:template>   
    
    <xsl:template match="item">
        
        <xsl:for-each select="current()[@type='forme'][contains(a[7],'SUB')]">
            <xsl:variable name="sub_index" select= "@pos"/>
            <xsl:variable name="gouv_index" select="replace(a[7], '\w+\((\d+)\)', '$1')"/>
            <xsl:choose>
                <xsl:when test="number($sub_index &lt; number($gouv_index))">
                    <xsl:value-of select="concat(current()/f, ' ',current()/c,' ', following-sibling::item[@pos = number($gouv_index)]/f,' ', following-sibling::item[@pos = number($gouv_index)]/c)"/>
                    <xsl:text>&#xD;&#xA;</xsl:text>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="concat(current()/f, ' ',current()/c, ' ', preceding-sibling::item[@pos = number($gouv_index)]/f, ' ', preceding-sibling::item[@pos = number($gouv_index)]/c)"/>
                    <xsl:text>&#xD;&#xA;</xsl:text>
               </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
        
    </xsl:template>
    
</xsl:stylesheet>

我正在寻找一种方法来获取模板捕获项目之外的这些项目节点。我用变量、序列、元素尝试了很多次,但我的每个 SUB 项目 + pos 项目都没有节点列表。最初,我不知道如何连接这两个节点。并将它们放在节点列表中对我来说是不可能的。我不想要完整的代码,只是在模板之外加入我的项目列表的方式。这是我对整个文件的输出:

 je Cl remonte V
je Cl traverse V
je Cl continue V
je Cl continue V
qui Qu est V
il Cl a V
je Cl reprends V
je Cl crois V
c Cl est V
je Cl sais V
c Cl est V
c Cl est V
je Cl vais V
je Cl retrouve V
je Cl vais V
je Cl vais V
je Cl vais V
c Cl est V
je Cl vais V
je Cl crois V
c Cl est V
je Cl vais V
je Cl vais V
je Cl souviens V
je Cl vais V
je Cl vais V
j Cl arrive V
il Cl a V
ils Cl sont V
je Cl suis V
tu Cl vois V
tu Cl continues V
tu Cl traverses V
tu Cl arrives V
c Cl est V
tu Cl passes V
tu Cl montes V
tu Cl passes V
il Cl a V
tu Cl arrives V
tu Cl rentres V
tu Cl arrives V
c Cl est V
je Cl crois V
ça Pro sera V
tu Cl traverses V
tu Cl arrives V
c Cl est V
tu Cl descends V
c Cl est V
qui Qu descend V
tu Cl passes V
tu Cl passes V
c Cl est V
il Cl semble V
tu Cl montes V
tu Cl arrives V
c Cl est V
il Cl a V
c Cl est V
programme N comporte V
nous Cl proposons V
qui Qu dormaient V
prédécesseurs N avaient V
l Cl retrouve V
vous Cl semblez V
c Cl est V
nous Cl acceptons V
nous Cl sommes V
qui Qu a V
combats N jalonnent V
c Cl est V
nous Cl avons V
nous Cl avons V
nous Cl avons V

但我需要用最常用的词对它进行排序,按类别排序(事实上,文件要大得多,所以可能会有一些变化)。我需要一种处理节点列表的方法。之后我会更容易分类和计数。我无法在我的 <xsl:template match="item"> 中完成所有操作不知道)谢谢你的关注。

标签: xmlxsltxpathnlp

解决方案


正如我之前的回答所述:https ://stackoverflow.com/a/67193030/3710053 <xsl:for-each select="current() 没有用,因为您的匹配上下文是一项。

我试图了解您的目标,所以也许这是您可以使用的方向。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
  xmlns:exsl="http://exslt.org/common">
  <xsl:output method="text" encoding="UTF-8"/>
  
  
  <xsl:template match="/">
    <xsl:variable name="itemsToSort" as="element(itemToSort)*">
      <xsl:apply-templates select="items/item[@type='forme'][contains(a[7],'SUB')]"/>
    </xsl:variable>
    <xsl:apply-templates select="$itemsToSort">
      <xsl:sort select="."/>
    </xsl:apply-templates>
  </xsl:template>
  
  <xsl:template match="item">
    <itemToSort>
      <xsl:variable name="sub_index" select= "@pos"/>
      <xsl:variable name="gouv_index" select="replace(a[7], '\w+\((\d+)\)', '$1')"/>
      <xsl:choose>
        <xsl:when test="number($sub_index &lt; number($gouv_index))">
          <xsl:value-of select="concat(current()/f, ' ',current()/c,' ', following-sibling::item[@pos = number($gouv_index)]/f,' ', following-sibling::item[@pos = number($gouv_index)]/c)"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="concat(current()/f, ' ',current()/c, ' ', preceding-sibling::item[@pos = number($gouv_index)]/f, ' ', preceding-sibling::item[@pos = number($gouv_index)]/c)"/>
        </xsl:otherwise>
      </xsl:choose>
    </itemToSort>    
  </xsl:template>

  <xsl:template match="itemToSort">
    <xsl:value-of select="."/>
    <xsl:text>
</xsl:text>
  </xsl:template>
    
</xsl:stylesheet>

推荐阅读