如何将XML中的函数式语言转换为Java?

时间:2010-02-04 19:01:55

标签: java xml antlr dsl

我正在使用基于XML模式的DSL,该模式支持函数语言功能,例如循环,带上下文的变量状态以及对外部Java类的调用。我想编写一个工具,它接受XML文档并将其转换为至少看起来像Java的东西,其中<set>标记转换为变量赋值,循环转换为{{1循环,等等。

我一直在研究ANTLR以及标准的XML解析器,我想知道是否有推荐的方法来解决这个问题。这样的XML文档是否可以转换为可转换为Java的东西,如果不是直接的话?

我愿意通过SAX编写解析,根据每个标记写一个中间语言,如果这是推荐的方式,但是让我暂停的部分是它基于上下文的方式与语言相同和Scheme一样,任何标签的子元素都在父元素之前被完全评估。

1 个答案:

答案 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是一种非常强大的编程语言,因此您可以做很多事情。