2013-01-08 28 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'会出现在哪里。目前还不清楚你想要哪个输出。如果在所需输出结构方面没有任何变化,那么简单地提供模板匹配模式的列举就足够了。 ' ...'。模式有助于多次处理节点,即第一次以一种方式使用第一模式以一种方式输出,第二次以第二种方式输出 –