我正在使用基于XML模式的DSL,该模式支持函数语言功能,例如循环,带上下文的变量状态以及对外部Java类的调用。我想编写一个工具,它接受XML文档并将其转换为至少看起来像Java的东西,其中<set>
标记转换为变量赋值,循环转换为{{1循环,等等。
我一直在研究ANTLR以及标准的XML解析器,我想知道是否有推荐的方法来解决这个问题。这样的XML文档是否可以转换为可转换为Java的东西,如果不是直接的话?
我愿意通过SAX编写解析,根据每个标记写一个中间语言,如果这是推荐的方式,但是让我暂停的部分是它基于上下文的方式与语言相同和Scheme一样,任何标签的子元素都在父元素之前被完全评估。
答案 0 :(得分:2)
您可以使用XSLT执行此操作。然后用它来生成你需要的代码片段。
(记得将输出格式设置为纯文本)
编辑:示例XSLT脚本
输入 - a.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="b.xsl"?>
<set name='myVar'>
<concat>
<s>newText_</s>
<ref>otherVar</ref>
</concat>
</set>
脚本 - b.xsl:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output method="text" />
<xsl:template match="set">
<xsl:value-of select="@name"/>=<xsl:apply-templates/>
</xsl:template>
<xsl:template match="concat">
<xsl:for-each select="*">
<xsl:if test="position() > 1">+</xsl:if>
<xsl:apply-templates select="."/>
</xsl:for-each>
</xsl:template>
<xsl:template match="ref">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="s">
<xsl:text>"</xsl:text>
<xsl:apply-templates/>
<xsl:text>"</xsl:text>
</xsl:template>
</xsl:stylesheet>
请注意,a.xml包含一条指令,允许支持XSLT的浏览器使用样式表b.xsl呈现它。 Firefox就是这样的浏览器。在firefox中打开a.xml,你会看到
myVar="newText_"+otherVar
请注意,XSLT是一种非常强大的编程语言,因此您可以做很多事情。