我的 .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>
Run Code Online (Sandbox Code Playgroud)
输出应该是这样的:
<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>
Run Code Online (Sandbox Code Playgroud)
这可以在 c# 中完成还是我们可以使用 xslt 2.0 来进行这种转换?
其他人已经给出了一些很好的建议。这是将所有内容组合在一起的一种方法,首先将输入的 SGML 转换为格式良好的 XML,然后使用 XSLT 将其转换为您需要的确切格式。
将您的 SGML 转换为格式良好的 XML
mzjn建议osx
的OpenSP包中的工具是一个很好的工具。由于您的 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>
Run Code Online (Sandbox Code Playgroud)
您还需要在 SGML 文件的开头添加适当的 doctype 声明。假设您的 DTD 在文件中viewed.dtd
。
<!DOCTYPE toplevel SYSTEM "viewed.dtd" >
Run Code Online (Sandbox Code Playgroud)
有了这个添加,您现在应该能够osx
将 SGML 转换为 XML。(它将无法转换以 a 开头的处理指令,/
因为这些指令在 XML 中是不允许的,并且会发出有关它们的警告。)
osx input.sgm > input.xml
Run Code Online (Sandbox Code Playgroud)
将生成的 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>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9055 次 |
最近记录: |