簡體   English   中英

XSLT:將嵌套的XML轉換為Ruby代碼

[英]XSLT: Transform nested XML into Ruby Code

我有幾個XML文件,我需要為其生成Ruby代碼。 我擁有的XML結構如下:

<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來獲取其余部分。

有人可以幫我這個忙嗎?

我不知道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>

Saxon 6.5.5使輸入變形

<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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM