Xslt sgml到xml的转换

Xslt sgml到xml的转换,xslt,c#-2.0,sgml,Xslt,C# 2.0,Sgml,我有一个来自.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 cit

我有一个来自.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>

xyz
2010
10
美国广播公司。
2010
9
输出应如下所示:

<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>

xyz

最初由Chris Lovett开发的能帮助解决这个问题吗?

为什么使用XSLT?我怀疑您能否将SGML映射到XML信息集或XDM

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


这是XSLT的前身。作者是詹姆斯·克拉克。这是his。

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


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

      将SGML转换为格式良好的XML

      软件包中的
      osx
      工具是一个很好的工具。由于SGML标记省略了结束标记,因此需要有一个DTD,从中可以确定元素的正确嵌套。如果没有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>
      
      通过这个添加,您现在应该能够使用
      osx
      将SGML转换为XML。(它将无法转换以
      /
      开头的处理指令,因为这些指令在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>
      
      
      
      您需要一个SGML解析器来正确执行此操作。XSLT2.0没有提供这样的解析器;理论上,可以用XSLT2.0编写一个,但这将是一个巨大的痛苦。我不知道在C#中解析SGML有什么支持。有各种代码示例可用。请看:我经常使用osx进行SGML到XML的转换,效果非常好。你好,Jukka Matilainen,“osx input.sgm>input.XML”你能提供链接下载“osx”EXE和支持文件吗…@Thirusanguraja Venkatesan,您可以从sourceforge下载页面找到openjade/opensp项目的下载链接:osx.exe在opensp-1.5.2-win32.zip中不可用,但我按照中给出的说明进行了操作,最终获得了exe文件,感谢您的指导。。
      osx input.sgm > input.xml
      
      <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>