6

我的 .sgm 文件中有以下示例 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 来进行这种转换?

4

4 回答 4

6

其他人已经给出了一些很好的建议。这是将所有内容组合在一起的一种方法,首先将输入 SGML 转换为格式良好的 XML,然后使用 XSLT 将其转换为您需要的确切格式。

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

mzjn建议osxOpenSP包中的工具是一个很好的工具。由于您的 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 文件的开头添加正确的 doctype 声明。假设您在 file 中有您的 DTD viewed.dtd

<!DOCTYPE toplevel SYSTEM "viewed.dtd" >

有了这个添加,您现在应该能够使用osxSGML 将其转换为 XML。(它将无法转换以 a 开头的处理指令,/因为这些指令在 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>
于 2010-12-16T13:48:41.517 回答
3

也许您可以使用osx SGML 到 XML 转换器。它是 OpenSP 包的一部分(基于 SP,最初由 James Clark 编写)。

于 2010-12-15T20:19:21.413 回答
-1

为什么选择 XSLT?我怀疑你可以将 SGML 映射到 XML Infoset 或 XDM ......

我认为您应该更好地使用为此任务制作的语言:DSSSL(文档样式语义和规范语言)

这是 XSLT 的前身。作者是詹姆斯·克拉克。这就是他的网站

于 2010-12-15T18:47:38.573 回答
-1

最初由 Chris Lovett 开发的SGML-Reader能否帮助解决这个问题?

于 2010-12-15T16:58:00.450 回答