2013-01-08 32 views
0

我有幾個需要生成Ruby代碼的XML文件。我的XML結構如下:XSLT:將嵌套的XML轉換爲Ruby代碼

<acronym_list> 
    xmlns="http://www.example.com/xsds" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.example.com/xsds   
         http://www.example.com/xsds/acronyms.xsd"> 
<item> 
    <metadata> 
    <release>...</release> 
    <id>...</id> 
    <checkdigit>...<checkdigit> 
    <status>...</status> 
    <date_added>...</date_added> 
    <date_modified>...</date_modified> 
    <language>...</language> 
    <license_url>...</license_url> 
    </metadata> 
    <info> 
    <name>...</name> 
    </info> 
</item> 
</acronym_list> 

在這種情況下,我們正在討論縮寫詞。我的列表中每個縮寫詞都重複item元素(及其子元素)。我還有幾個文件與info元素具有更多子元素的結構相似。

的Ruby代碼,我試圖擺脫會是什麼樣子:

Module acronym_list 
    def self.included(other) 
     include SAXMachine 
     SAXMachine.configure(other) do |c| 
      c.element :metadata, :class => metadata 
      c.element :info, :class => info 
     end 
    end 

    class metadata 
     include SAXMachine 
     c.element :release 
     c.element :id 
     c.element :checkdigit 
     c.element :status 
     c.element :date_added 
     c.element :date_modified 
     c.element :language 
     c.element :license_url 
    end 

    class info 
     include SAXMachine 
     c.element :name 
    end   
end 

同樣的模式遵循的是我試圖解析其他XML文件。我已經設法使第一部分使用模塊聲明,但我不知道足夠的XSLT來完成其餘部分。

有人能幫我解決這個問題嗎?

回答

1

我不知道的Ruby語法,所以我不知道是否縮進或空白問題,但與樣式

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:acs="http://www.example.com/xsds" 
    exclude-result-prefixes="acs"> 

<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="acs:acronym_list"> 
Module <xsl:value-of select="local-name()"/> 
    def self.included(other) 
    include SAXMachine 
    SAXMachine.configure(other) do |c| 
     <xsl:apply-templates select="acs:item/acs:*" mode="config"/> 
    end 
    end 

    <xsl:apply-templates select="acs:item/acs:*" mode="class"/> 
end 
</xsl:template> 

<xsl:template match="acs:item/acs:*" mode="config"> 
     c.element :<xsl:value-of select="local-name()"/>, :class => <xsl:value-of select="local-name()"/> 
</xsl:template> 

<xsl:template match="acs:item/acs:*" mode="class"> 
    class <xsl:value-of select="local-name()"/> 
    include SAXMachine 
    <xsl:apply-templates mode="class"/> 
    end 
</xsl:template> 

<xsl:template match="acs:item/acs:*/acs:*" mode="class"> 
    c.element :<xsl:value-of select="local-name()"/> 
</xsl:template> 

</xsl:stylesheet> 

撒克遜6.5.5 tansforms輸入

<acronym_list 
    xmlns="http://www.example.com/xsds" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.example.com/xsds   
         http://www.example.com/xsds/acronyms.xsd"> 
<item> 
    <metadata> 
    <release>...</release> 
    <id>...</id> 
    <checkdigit>...</checkdigit> 
    <status>...</status> 
    <date_added>...</date_added> 
    <date_modified>...</date_modified> 
    <language>...</language> 
    <license_url>...</license_url> 
    </metadata> 
    <info> 
    <name>...</name> 
    </info> 
</item> 
</acronym_list> 

到輸出

Module acronym_list 
    def self.included(other) 
    include SAXMachine 
    SAXMachine.configure(other) do |c| 

     c.element :metadata, :class => metadata 
     c.element :info, :class => info 
    end 
    end 


    class metadata 
    include SAXMachine 

    c.element :release 
    c.element :id 
    c.element :checkdigit 
    c.element :status 
    c.element :date_added 
    c.element :date_modified 
    c.element :language 
    c.element :license_url 
    end 

    class info 
    include SAXMachine 

    c.element :name 
    end 

end 
+0

這太棒了。謝謝!如果我想對項目元素進行通用處理(即,我有一個文件包含acronym_item,另一個文件包含asset_item),我可以採用類似的方法處理模式,就像上面所做的一樣? –

+1

那麼在你發佈的示例中有一個'acronym_list'元素,但沒有'acronym_item',所以我不確定'asset_item'會出現在哪裏。目前還不清楚你想要哪個輸出。如果在所需輸出結構方面沒有任何變化,那麼簡單地提供模板匹配模式的列舉就足夠了。 ' ...'。模式有助於多次處理節點,即第一次以一種方式使用第一模式以一種方式輸出,第二次以第二種方式輸出 –