Другие уже дали некоторые хороший совет. Вот один из способов собрать все это, сначала преобразовывая входной SGML в хорошо сформированный XML, а затем используя XSLT, чтобы преобразовать его в точный формат, который вам нужен.
преобразования SGML хорошо сформированный XML
osx
инструмента из OpenSP пакета suggested by mzjn является хорошим инструментом для этого. Поскольку ваша разметка 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. Предполагая, что у вас есть 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>
Вам нужен синтаксический анализатор SGML делать это правильно. XSLT 2.0 не предоставляет такой синтаксический анализатор; вы могли бы теоретически написать один в XSLT 2.0, но это было бы огромной болью. Я не знаю, какая поддержка существует для синтаксического анализа SGML в C#. – LarsH 2010-12-15 17:00:16