2010-12-15 66 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