2010-12-15 48 views
2

J'ai un exemple suivant les données SGML de mon dossier .sgm et je veux convertir cela dans xmlSGML à XML convertion

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

devrait être comme sortie ceci:

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

cela peut être fait en C# ou pouvons-nous utiliser xslt 2.0 pour faire ce genre de conversion?

+0

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

Répondre

-1

Est-ce que le SGML-Reader, originaire de Chris Lovett peut vous aider à résoudre ce problème?

+0

Comment l'appliquer? J'ai essayé mais je ne pouvais pas le comprendre. – atif

+0

Plusieurs exemples de code sont disponibles. Voir: http://www.hanselman.com/blog/PostprocessingAutoClosedSGMLTagsWithTheSGMLReader.aspx –

0

Pourquoi XSLT? Je doute que vous pouvez mapper SGML à XML Infoset ou XDM ...

Je pense que vous devriez mieux utiliser la langue fait pour cette tâche: DSSSL (document de style Sémantique et Specification Language)

C'est le prédécesseur de XSLT. L'auteur est James Clark. Et ceci est le site.

4

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

Salut, Jukka Matilainen, "osx input.sgm> input.xml" Pourriez-vous s'il vous plaît fournir Lien pour télécharger ce fichier "OSX" EXE et les fichiers de soutien ... –

+1

@Thirusanguraja Venkatesan, vous pouvez trouver des liens de téléchargement de la page de téléchargement sourceforge pour le projet openjade/opensp: http://sourceforge.net/projects/openjade/files/opensp/1.5.2/ –

+0

** osx.exe ** non disponible dans ** OpenSP-1.5.2-win32.zip ** , mais je suis l'instruction donnée dans http://openjade.sourceforge.net/doc/build.htm, Enfin j'ai eu des fichiers EXE, Merci pour une bonne orientation .. –