我的.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来进行这种转换?
答案 0 :(得分:4)
其他人已经给出了一些好的建议。通过首先将输入SGML转换为格式良好的XML然后使用XSLT将其转换为您需要的确切格式,这是将它们放在一起的一种方法。
将您的SGML转换为格式良好的XML
OpenSP包suggested by mzjn中的osx
工具是一个很好的工具。由于您的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声明。假设您的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>
答案 1 :(得分:2)
也许您可以使用 osx SGML到XML转换器。它是OpenSP软件包的一部分(基于SP,最初由James Clark编写)。
答案 2 :(得分:-1)
最初由Chris Lovett开发的 SGML-Reader 可以帮助解决这个问题吗?
答案 3 :(得分:-1)
为什么选择XSLT?我怀疑你可以将SGML映射到XML Infoset或XDM ......
我认为您应该更好地使用为此任务制作的语言: DSSSL(文档样式语义和规范语言)
这是XSLT的前身。作者是詹姆斯克拉克。这是他的site。
答案 4 :(得分:-1)
请看一下SGML的一些建议 - &gt;我在这个问题上贴了XML转换:
Strategy for parsing LOTS and LOTS of not-so-well formed SGML / XML documents