2010-12-15 49 views
2

我从.sgm文件下面的示例SGML的数据,我想这个转换中XMLSGML到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

你需要一个SGML解析器做这适当。 XSLT 2.0不提供这样的解析器;理论上你可以在XSLT 2.0中编写一个,但这将是一个巨大的痛苦。我不知道在C#中解析SGML有什么支持。 – LarsH 2010-12-15 17:00:16

回答

-1

最初由Chris Lovett开发的SGML-ReaderSGML-Reader可以帮助解决这个问题吗?

+0

如何应用它?我尝试过但无法弄清楚。 – atif 2010-12-15 17:12:08

+0

有各种可用的代码示例。请参阅:http://www.hanselman.com/blog/PostprocessingAutoClosedSGMLTagsWithTheSGMLReader.aspx – 2010-12-15 17:14:26

0

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

我认为你应该更好地利用这一任务取得的语言:(文档样式语义和规范语言)DSSSL

这是XSLT的前身。作者是詹姆斯克拉克。这是他的site

4

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

转换您的SGML到格式良好的XML

OpenSPsuggested by mzjnosx工具是一个很好的工具。由于您的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> 

你还需要一个适当的DOCTYPE声明添加到您的SGML文件的开头。假设你的文件viewed.dtd中有你的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> 
+0

您好,Jukka Matilainen,“osx input.sgm> input.xml”您能否提供链接以下载“OSX”EXE和支持文件... – 2014-02-20 09:29:45

+1

@Thirusanguraja Venkatesan,您可以从sourceforge下载页面找到下载链接openjade/opensp项目:http://sourceforge.net/projects/openjade/files/opensp/1.5.2/ – 2014-02-20 20:45:46

+0

** osx.exe **在OpenSP-1.5.2-win32.zip中不可用** ,但我遵循http://openjade.sourceforge.net/doc/build.htm中给出的说明,最后我得到了EXE文件,感谢您的良好指导。 – 2014-02-21 07:26:26