D'autres ont déjà donné quelques bon conseil. Voici une façon de tout mettre ensemble en convertissant d'abord le SGML d'entrée en XML bien formé, puis en utilisant XSLT pour le transformer au format exact dont vous avez besoin.
Convertir vos SGML à XML bien formé
L'outil osx
de l'emballage OpenSPsuggested by mzjn est un bon outil pour cela. Comme votre balise SGML omet les balises de fin, vous devez disposer d'une DTD à partir de laquelle l'imbrication correcte des éléments peut être déterminée. Si vous n'avez pas de DTD, vous devez en créer un. Pour votre entrée exemple, il pourrait être aussi simple que cela:
<!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>
Vous devez également ajouter une déclaration DOCTYPE au début de votre fichier SGML. En supposant que vous avez votre DTD dans le fichier viewed.dtd
.
<!DOCTYPE toplevel SYSTEM "viewed.dtd" >
Avec cet ajout, vous devriez maintenant capable d'utiliser la osx
pour convertir le SGML à XML. (Il ne sera pas capable de convertir les instructions de traitement commençant par /
car celles-ci ne sont pas autorisées en XML, et émettra un avertissement à leur sujet.)
osx input.sgm > input.xml
Transformer le XML résultant au format de votre choix
Pour le cas ci-dessus, vous pouvez utiliser quelque chose comme la feuille de style XSLT suivante:
<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>
Vous avez besoin d'un analyseur SGML faire ceci correctement. XSLT 2.0 ne fournit pas un tel analyseur; vous pourriez théoriquement en écrire un dans XSLT 2.0 mais ce serait une énorme douleur. Je ne sais pas quel support il y a pour analyser SGML en C#. – LarsH