2010-12-15 1 views
2

конвертации У меня есть следующий пример SGML данные из моего .sgm файла, и я хочу преобразовать это в к XMLSGML в 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> 

Вывод должен быть таким:

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

Может ли это быть сделано в C# или мы можем использовать xslt 2.0 для такого преобразования?

+0

Вам нужен синтаксический анализатор SGML делать это правильно. XSLT 2.0 не предоставляет такой синтаксический анализатор; вы могли бы теоретически написать один в XSLT 2.0, но это было бы огромной болью. Я не знаю, какая поддержка существует для синтаксического анализа SGML в C#. – LarsH 2010-12-15 17:00:16

ответ

-1

Can SGML-Reader, разработанный Chris Lovett, поможет решить эту проблему?

+0

Как его применять? Я попытался, но не мог понять. – atif 2010-12-15 17:12:08

+0

Имеются различные примеры кода. См .: http://www.hanselman.com/blog/PostprocessingAutoClosedSGMLTagsWithTheSGMLReader.aspx – 2010-12-15 17:14:26

0

Почему XSLT? Я сомневаюсь, что вы можете отобразить SGML в XML Infoset или XDM ...

Я думаю, что вы должны лучше использовать язык сделал для решения этой задачи: DSSSL (Стиль документа семантики и спецификации языка)

Это предшественником XSLT. Автор Джеймс Кларк. И это его site.

1

Возможно, вы используете конвертер SGML в XML osx. Это часть пакета OpenSP (на основе SP, первоначально написанного Джеймсом Кларком).

+1

Я обычно использую osx для преобразования SGML в XML, он работает очень хорошо. – mirod 2012-06-27 10:14:50

4

Другие уже дали некоторые хороший совет. Вот один из способов собрать все это, сначала преобразовывая входной 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>