[英]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.