2013-12-08 56 views
0

我試圖簡化從數據庫中的導出,並且使用Muenchian方法以及試圖構建遞歸函數都失敗了。xslt在不同的屬性上重複

這是我的我的輸入看起來像:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <Product> 
    <Values> 
     <Value AttributeID="Master">word1</Value> 
     <Value AttributeID="Syn1">first word 1</Value> 
     <Value AttributeID="Syn2">second word 2</Value> 
    </Values> 
    </Product> 
    <Product> 
    <Values> 
     <Value AttributeID="Master">word1</Value> 
     <Value AttributeID="Syn2">second word 2</Value> 
    </Values> 
    </Product> 
    <Product> 
    <Values> 
     <Value AttributeID="Master">word1</Value> 
     <Value AttributeID="Syn1">third word 3</Value> 
     <Value AttributeID="Syn2">second word 2</Value> 
    </Values> 
    </Product> 
    <Product> 
    <Values> 
     <Value AttributeID="Master">word2</Value> 
     <Value AttributeID="Syn1">first word 1</Value> 
     <Value AttributeID="Syn4">fourth word 4</Value> 
    </Values> 
    </Product> 
</root> 

這是我想達到的目標:

<root> 
    <pair> 
    <master>word1</master> 
    <syn>first word 1</syn> 
    </pair> 
    <pair> 
    <master>word1</master> 
    <syn>second word 2</syn> 
    </pair> 
    <pair> 
    <master>word1</master> 
    <syn>third word 3</syn> 
    </pair> 
    <pair> 
    <master>word2</master> 
    <syn>first word 1</syn> 
    </pair> 
    <pair> 
    <master>word2</master> 
    <syn>fourth word 4</syn> 
    </pair> 
</root> 

另外還有這樣的事情可以做的伎倆:

<root> 
    <pair> 
    <master>word1</master> 
    <syns> 
     <syn>first word 1</syn> 
     <syn>second word 2</syn> 
     <syn>third word 3</syn> 
    </syns> 
    </pair> 
    <pair> 
    <master>word2</master> 
    <syns> 
     <syn>first word 1</syn> 
     <syn>fourth word 4</syn> 
    </syns> 
    </pair> 
</root> 

基本上我得到一個主詞和同義詞(從無到多5每個主)。我能夠使用模板輕鬆生成重複列表,但是我無法嘗試刪除重複項或只是將其推送到變量中進行後期處理。我的問題是,同義詞可以在不同的屬性,並始終需要參考他們的實際主人...

我需要主詞+任何同義詞的獨特組合 - 理想情況下,輸出將按字母順序排序:)

感謝您的任何幫助。

回答

0

這裏是一個可能的方式,我認爲:

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

<xsl:key name="syn" 
     match="Value[@AttributeID!='Master']" 
     use="concat(., '|', ../Value[@AttributeID='Master'])" /> 

<xsl:template match="/"> 
<root> 
    <xsl:for-each select="root/Product/Values/Value[@AttributeID!='Master'][generate-id()=generate-id(key('syn', concat(., '|', ../Value[@AttributeID='Master']))[1])]"> 
     <pair> 
      <master><xsl:value-of select="../Value[@AttributeID='Master']"/></master> 
      <syn><xsl:value-of select="."/></syn> 
     </pair> 
    </xsl:for-each> 
</root> 
</xsl:template> 
</xsl:stylesheet> 

爲排列,你沒有說你要作爲排序依據是什麼。

+0

非常感謝你,這個伎倆。爲了克服一些文本問題,我不得不將normalize-space()和lower-case()函數添加到鍵和第二個generate-id。排序是由碩士和順利,但很容易添加:) – user3079236