2012-03-11 101 views
0

我正在處理一個xml,它用它的塊和單詞表示一個句子。問題是,在XML中,我給出的單詞順序是根據其父塊設置的,而不是它在句子中的順序。這是XML的樣子:使用xslt設置xml節點順序

<SENTENCE> 
    <CHUNK ord="4"> 
    <CHUNK ord="2"> 
     <CHUNK ord="1"> 
     <WORD ord="0" /> 
     </CHUNK> 
     <WORD ord="2" /> 
     <CHUNK ord="3"> 
     <WORD ord="0" />> 
     </CHUNK> 
    </CHUNK> 
    <WORD ord="1" /> 
     <WORD ord="0" /> 
    <CHUNK ord="5"> 
     <WORD ord="0"> 
     <WORD ord="1" /> 
     </WORD> 
     <CHUNK ord="6"> 
     <WORD ord="0"> 
      <WORD ord="2"> 
      <WORD ord="3" /> 
      <WORD ord="1" /> 
      </WORD> 
     </WORD> 
     </CHUNK> 
    </CHUNK> 
    <CHUNK ord="7"> 
     <WORD ord="0"> 
     <WORD ord="1" /> 
     </WORD> 
    </CHUNK> 
    <CHUNK ord="8"> 
     <WORD ord="0" /> 
    </CHUNK> 
    </CHUNK> 
</SENTENCE> 

我需要知道在句子中詞的實際,以使其他一些處理,但不失XML的結構。例如,在上面的例子中,輸出XML應該是這樣的:通過使用XSLT來創建的每一個字元素的新屬性,它會顯示

<SENTENCE> 
    <CHUNK ord="4"> 
    <CHUNK ord="2"> 
     <CHUNK ord="1"> 
     <WORD ord="0" senOrd="0" /> 
     </CHUNK> 
     <WORD ord="2" senOrd="1" /> 
     <CHUNK ord="3"> 
     <WORD ord="0" senOrd="3" />> 
     </CHUNK> 
    </CHUNK> 
    <WORD ord="1" senOrd="4" /> 
    <WORD ord="0" senOrd="5" /> 
    <CHUNK ord="7"> 
     <WORD ord="0" senOrd="12"> 
     <WORD ord="1" senOrd="13" /> 
     </WORD> 
    </CHUNK> 
    <CHUNK ord="8"> 
     <WORD ord="0" senOrd="14" /> 
    </CHUNK> 
    </CHUNK> 
    <CHUNK ord="5"> 
    <WORD ord="0" senOrd="6"> 
     <WORD ord="1" senOrd="7" /> 
    </WORD> 
    <CHUNK ord="6"> 
     <WORD ord="0" senOrd="8"> 
     <WORD ord="2" senOrd="10"> 
      <WORD ord="3" senOrd="11" /> 
      <WORD ord="1" senOrd="9" /> 
     </WORD> 
     </WORD> 
    </CHUNK> 
    </CHUNK> 
</SENTENCE> 

我一直在努力做的在句子中的順序,但我甚至不知道從哪裏開始。如果有人能幫助我,我將不勝感激。

這裏給出的英語句子可能的XML「這僅僅是XML的例子」:

<SENTENCE> 
<CHUNK ord="1"> 
    <CHUNK ord="0"> 
     <WORD ord="1" form="is"> 
      <WORD ord="0" form="this" /> 
     </WORD> 
    </CHUNK> 
    <WORD ord="1" form="just"> 
    <CHUNK ord="2"> 
     <WORD ord="2" form="of"> 
      <WORD ord="0" form="an" /> 
     </WORD> 
     <WORD ord="1" form="example" /> 
     <CHUNK ord="0"> 
      <WORD ord="1" form="xml" /> 
      <WORD ord="0" form="the" /> 
     </CHUNK> 
    </CHUNK> 
    </CHUNK> 
</CHUNK> 

什麼是senOrd屬性將表明是每個單詞在句子的順序。

+0

所以說,如果你用大塊的ord命令在一個句子中的單詞,然後在這個單詞的ord中,你會在句子中排序嗎?如果是這樣,那麼我想你需要創建一個xpath,按照該順序選擇數據,然後使用計數器添加senOrd。計數器可能必須是遞歸模板的參數,每次調用都會遞增(因爲xslt是有效的)。但這是我能記住xslt的限制[編輯:哦,但是你需要保存順序,所以首先添加一個屬性來記錄,然後重寫/刪除] – 2012-03-11 19:43:27

+0

我不明白你的描述,我可以注意在你的輸出中senOrd總是ord + ord-of-parent是你需要實現的規則嗎? – 2012-03-11 19:47:11

+0

也許這個例子xml我的帖子不是很複雜。但是真正的xml要複雜得多,因爲有更多的嵌套塊和單詞(這些xml文件在語法分析之後代表句子,所以根據輸入句子輸出會更容易或不更簡單)。 – Ion 2012-03-11 20:22:34

回答

0

我想你需要計算所有字屬於元素與低階自己元素,加上所有元素與較低的ord屬性在相同的塊。

<xsl:value-of select="count(//WORD[ancestor::CHUNK[1]/@ord &lt; $currentOrd]) 
    + count(//WORD[ancestor::CHUNK[1]/@ord = $currentOrd][@ord &lt; current()/@ord])"/> 

currentOrd定義如下:考慮到下面的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="WORD"> 
     <xsl:variable name="currentOrd" select="ancestor::CHUNK[1]/@ord"/> 
     <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:attribute name="senOrd"> 
      <xsl:value-of select="count(//WORD[ancestor::CHUNK[1]/@ord &lt; $currentOrd]) + count(//WORD[ancestor::CHUNK[1]/@ord = $currentOrd][@ord &lt; current()/@ord])"/> 
     </xsl:attribute> 
     <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*|@*"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

當應用於以下示例XML,

<xsl:variable name="currentOrd" select="ancestor::CHUNK[1]/@ord"/> 

所以輸出

<SENTENCE> 
    <CHUNK ord="4"> 
     <CHUNK ord="2"> 
     <CHUNK ord="1"> 
      <WORD ord="0" senOrd="0"/> 
     </CHUNK> 
     <WORD ord="2" senOrd="1"/> 
     <CHUNK ord="3"> 
      <WORD ord="0" senOrd="2"/> 
     </CHUNK> 
     </CHUNK> 
     <WORD ord="1" senOrd="4"/> 
     <WORD ord="0" senOrd="3"/> 
     <CHUNK ord="5"> 
     <WORD ord="0" senOrd="5"> 
      <WORD ord="1" senOrd="6"/> 
     </WORD> 
     <CHUNK ord="6"> 
      <WORD ord="0" senOrd="7"> 
       <WORD ord="2" senOrd="9"> 
        <WORD ord="3" senOrd="10"/> 
        <WORD ord="1" senOrd="8"/> 
       </WORD> 
      </WORD> 
     </CHUNK> 
     </CHUNK> 
     <CHUNK ord="7"> 
     <WORD ord="0" senOrd="11"> 
      <WORD ord="1" senOrd="12"/> 
     </WORD> 
     </CHUNK> 
     <CHUNK ord="8"> 
     <WORD ord="0" senOrd="13"/> 
     </CHUNK> 
    </CHUNK> 
</SENTENCE> 
+0

謝謝蒂姆。我一直在用我的一些xml文件證明你的xslt,它的作用就像魅力(現在我看到你的回覆並不那麼複雜)。感謝大衛和安德魯的幫助,我很抱歉,如果我把我的不好的解釋弄糊塗了(我的英文不夠好)。 – Ion 2012-03-11 22:17:10

0

我不知道,如果你的問題描述,但是這會產生所要求的輸出

<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 


<xsl:template match="*|@*"> 
<xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:apply-templates/> 
</xsl:copy> 
</xsl:template> 

<xsl:template match="word/@ord"> 
<xsl:copy-of select="."/> 
<xsl:attribute name="senOrd"> 
    <xsl:value-of select=". + ancestor::chunk[1]/@ord"/> 
</xsl:attribute> 
</xsl:template> 

</xsl:stylesheet> 
+0

它與第一個例子一起工作,但是我剛剛發佈的那個沒有。 – Ion 2012-03-11 20:31:07

+0

我很抱歉,我無法理解你的問題描述,所以只是在這個例子中引起了轟動。如果你編輯你的問題來描述如何計算你想在semOrd中輸入的數字,那麼我或其他人肯定會發布答案。這個問題(至少對我來說)與xslt無關,我只是不知道xslt應該編碼的總和。 – 2012-03-11 21:09:31

+0

我想我的評論描述了需要什麼。大塊是有序的。然後,在大塊內,這些詞是有序的。需要的是順序排列後的順序索引。當然,在第二個例子中,大塊排序從1開始,或者某些senOrd值丟失或者從未困擾過來回復我是沒有幫助的。但如果你看例子,它們與我的建議是一致的。 – 2012-03-11 21:28:04