xslt – sgml到xml的转换

前端之家收集整理的这篇文章主要介绍了xslt – sgml到xml的转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个来自我的.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>

输出应该是这样的:

<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来进行这种转换?

其他人已经给出了一些好的建议.通过首先将输入SGML转换为格式良好的XML,然后使用XSLT将其转换为您需要的确切格式,这是将它们组合在一起的一种方法.

将您的SGML转换为格式良好的XML

来自OpenSPsuggested by mzjn的osx工具是一个很好的工具.由于您的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>

您还需要在SGML文件的开头添加适当的doctype声明.假设您在文件中查看了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>
原文链接:https://www.f2er.com/xml/293109.html

猜你在找的XML相关文章