2012-06-01 52 views
0

美好的一天!如何使用預定義規則安排和分組元素?

我試圖建立一個XSL轉換文件做了下:

有是有一堆的類型特徵的子元素的元素。他們每個人都有其獨特的名字。 我也有介紹了一些人名和一定的命名特性集之間的邏輯連接列表(稱爲數據集):

CharacteristicName:DatasetName來
− − − − − − − − − − − − − − − − − − − − − − − − − − − −
Att1_DS1                                  :  DS1
Att2_DS1                                  :  DS1
Att1_DS2                                  :  DS2
Att2_DS2                                  :  DS2

我必須轉換XML這樣的主要元素應該得到<Dataset>類型的新元素。如果列出的特徵名稱出現在源文檔中,則應該會出現這些帶有表格中的id的數據集。然後相應的特性拷入到這些數據集元/

如果某些特性名稱未在表中列出,所以應該被放置在數據集id爲「其他」

源XML:

<Object> 
    <ID>Obj1</ID> 

    <!--DS1-->  
    <Characteristic> 
     <Name>Att1_DS1</Name> 
     <Value>25</Value> 
    </Characteristic> 

    <!--DS2--> 
    <Characteristic> 
     <Name>Att1_DS2</Name> 
     <Value>25</Value> 
    </Characteristic> 

    <!--DS1--> 
    <Characteristic> 
     <Name>Att2_DS1</Name> 
     <Value>ABC</Value> 
    </Characteristic>  

    <!--DS2--> 
    <Characteristic> 
     <Name>Att2_DS2</Name> 
     <Value>ABC</Value> 
    </Characteristic> 

      <!--Other--> 
    <Characteristic> 
     <Name>Att3_NN</Name> 
     <Value>25</Value> 
    </Characteristic> 

</Object> 

應該轉化爲:

<Object> 
    <ID>Obj1</ID> 

    <Dataset id="DS1"> 
     <Characteristic> 
      <Name>Att1_DS1</Name> 
      <Value>25</Value> 
     </Characteristic> 
     <Characteristic> 
      <Name>Att2_DS1</Name> 
      <Value>ABC</Value> 
     </Characteristic> 
    </Dataset> 

    <Dataset id="DS2"> 
     <Characteristic> 
      <Name>Att1_DS1</Name> 
      <Value>25</Value> 
     </Characteristic> 
     <Characteristic> 
      <Name>Att2_DS1</Name> 
      <Value>ABC</Value> 
     </Characteristic> 
    </Dataset> 

    <Dataset id="Other"> 
     <Characteristic> 
      <Name>Att3_NN</Name> 
      <Value>25</Value> 
     </Characteristic> 
    </Dataset> 

</Object> 

能否請你幫我做這些。任何提示或想法我應該移動哪個方向?

回答

0

這種轉變

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:my="my:my" exclude-result-prefixes="my"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

     <my:datasets> 
     <ds> 
     <id>DS1</id> 
     <n>Att1_DS1</n> 
     <n>Att2_DS1</n> 
     </ds> 
     <ds> 
     <id>DS2</id> 
     <n>Att1_DS2</n> 
     <n>Att2_DS2</n> 
     </ds> 
     <ds> 
     <id>other</id> 
     <n>Att3_NN</n> 
     </ds> 
     </my:datasets> 

     <xsl:variable name="vDS" select="document('')/*/my:datasets/*"/> 

     <xsl:template match="/*"> 
     <Object> 
     <xsl:copy-of select="ID"/> 

     <xsl:apply-templates select= 
      "$vDS[n = current()/Characteristic/Name]"> 
      <xsl:with-param name="pChars" select="Characteristic"/> 
     </xsl:apply-templates> 
     </Object> 
     </xsl:template> 

     <xsl:template match="ds"> 
     <xsl:param name="pChars"/> 
     <Dataset id="{id}"> 
     <xsl:copy-of select="$pChars[Name = current()/n]"/> 
     </Dataset> 
     </xsl:template> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<Object> 
    <ID>Obj1</ID> 

    <Characteristic> 
     <Name>Att1_DS1</Name> 
     <Value>25</Value> 
    </Characteristic> 

    <Characteristic> 
     <Name>Att1_DS2</Name> 
     <Value>25</Value> 
    </Characteristic> 

    <Characteristic> 
     <Name>Att2_DS1</Name> 
     <Value>ABC</Value> 
    </Characteristic> 

    <Characteristic> 
     <Name>Att2_DS2</Name> 
     <Value>ABC</Value> 
    </Characteristic> 

    <Characteristic> 
     <Name>Att3_NN</Name> 
     <Value>25</Value> 
    </Characteristic> 
</Object> 

產生想要的,正確的結果

<Object> 
    <ID>Obj1</ID> 
    <Dataset id="DS1"> 
     <Characteristic> 
     <Name>Att1_DS1</Name> 
     <Value>25</Value> 
     </Characteristic> 
     <Characteristic> 
     <Name>Att2_DS1</Name> 
     <Value>ABC</Value> 
     </Characteristic> 
    </Dataset> 
    <Dataset id="DS2"> 
     <Characteristic> 
     <Name>Att1_DS2</Name> 
     <Value>25</Value> 
     </Characteristic> 
     <Characteristic> 
     <Name>Att2_DS2</Name> 
     <Value>ABC</Value> 
     </Characteristic> 
    </Dataset> 
    <Dataset id="other"> 
     <Characteristic> 
     <Name>Att3_NN</Name> 
     <Value>25</Value> 
     </Characteristic> 
    </Dataset> 
</Object> 
+0

我很抱歉,但似乎我沒有那麼清楚地解釋我的任務((重點是特性名稱並不總是有他們的名字中的數據集的名稱。這意味着我必須以某種方式存儲代碼將從中找到關係的字典。 –

+0

@OlegMudrov:看到我更新的答案。 –

+0

@OlegMudrov:我的回答對你有用嗎?你還有問題嗎? –