SGML转XML的转换方法

6

我有一个来自.sgml文件的样例sgml数据,我想将其转换为xml格式。

<?dtd name="viewed">
<?XMLDOC>
<viewed >xyz
<cite>
<yr>2010
<pno cite="2010 abc 1188">10
<?/XMLDOC>

<?XMLDOC>
<viewed>abc.
<cite>
<yr>2010
<pno cite="2010 xyz 5133">9
<?/XMLDOC>

输出结果应该如下所示:
<index1>
    <num viewed="xyz"/>
    <heading>xyz</heading>
    <index-refs>
      <link  caseno="2010 abc 1188</link>
    </index-refs>
  </index-1>
<index1>
    <num viewed="abc"/>
    <heading>abc</heading>
    <index-refs>
      <link  caseno="2010 xyz 5133</link>
    </index-refs>
  </index-1>

这种转换可以用C#完成,也可以使用XSLT 2.0完成。


你需要一个 SGML 解析器来正确地完成这个任务。XSLT 2.0 并没有提供这样的解析器;理论上你可以用 XSLT 2.0 编写一个,但是这将是一件非常麻烦的事情。我不知道 C# 中解析 SGML 的支持情况。 - LarsH
4个回答

6

其他人已经给出了一些好的建议。以下是将输入的SGML转换为格式良好的XML,然后使用XSLT将其转换为所需精确格式的一种方法。

将您的SGML转换为格式良好的XML

来自OpenSP软件包的osx工具建议由mzjn提供是一个不错的工具。由于您的SGML标记省略了结束标记,因此需要有一个DTD来确定元素的正确嵌套。如果您没有DTD,则需要创建一个。对于您的示例输入,可以简单地编写如下:

<!ELEMENT toplevel o o (viewed)+>

<!ELEMENT viewed - o (#PCDATA,cite)>
<!ELEMENT cite - o (yr,pno)>
<!ELEMENT yr - o (#PCDATA)>
<!ELEMENT pno - o (#PCDATA)>

<!ATTLIST pno cite CDATA #REQUIRED>

您还需要在SGML文件开头添加适当的文档类型声明。假设您的DTD文件名为viewed.dtd

<!DOCTYPE toplevel SYSTEM "viewed.dtd" >

使用这个添加功能,现在你应该能够使用 osx 将 SGML 转换为 XML。(它将无法转换以 / 开头的处理指令,因为这些在 XML 中不被允许,并会发出有关它们的警告。)

osx input.sgm > input.xml

将生成的XML转换为所需的格式

对于上述情况,您可以使用以下类似的XSLT样式表:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="VIEWED">
    <index1>
      <num viewed="{normalize-space(text())}"/>
      <heading>
        <xsl:value-of select="normalize-space(text())"/>
      </heading>
      <index-refs>
        <xsl:apply-templates select="CITE"/>
      </index-refs>
    </index1>
  </xsl:template>

  <xsl:template match="CITE">
    <link caseno="{PNO/@CITE}"/>
  </xsl:template>

</xsl:stylesheet>

你好,Jukka Matilainen,"osx input.sgm > input.xml"。请问您能否提供下载链接以获取那个“OSX”可执行文件和相关支持文件... - Thirusanguraja Venkatesan
1
@Thirusanguraja Venkatesan,您可以从sourceforge下载页面找到openjade/opensp项目的下载链接:http://sourceforge.net/projects/openjade/files/opensp/1.5.2/。 - Jukka Matilainen
在OpenSP-1.5.2-win32.zip中找不到osx.exe,但是我遵循了http://openjade.sourceforge.net/doc/build.htm中给出的指示,最终我得到了EXE文件,感谢良好的指导。 - Thirusanguraja Venkatesan

3

1
我经常使用OSX进行SGML到XML的转换,效果非常好。 - mirod

-1

Chris Lovett 开发的SGML-Reader能帮助解决这个问题吗?


有各种不同的代码示例可供使用。请参见:http://www.hanselman.com/blog/PostprocessingAutoClosedSGMLTagsWithTheSGMLReader.aspx - Dimitre Novatchev

-1

为什么使用XSLT?我怀疑你能否将SGML映射到XML Infoset或XDM...

我认为你最好使用为此任务而设计的语言:DSSSL(文档样式语义和规范语言)

这是XSLT的前身。作者是James Clark。这是他的网站


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接