有一个xml文件,我写了一个xsl文件将该xml格式化成我需要的文本格式,用浏览器打开没问题,我希望有一个工具(模块)能够被我用程序调用,传入一xml文件和xsl文件,输出一个解析出来的文本文件,谁有这方面的建议?

解决方案 »

  1.   

    用XMLDocument应该容易做到这一点
      

  2.   

    uses msxml,msxmldom;procedure TForm1.Button1Click(Sender: TObject);
    var
      xdoc,xslt : IXMLDOMDocument;
      s    : String;
    begin
      xdoc:=CreateDOMDocument();
      xslt:=CreateDOMDocument();
      xdoc.load('aXml.xml');
      xslt.load('aXsl.xsl');
      s:=xdoc.transformNode(xslt.documentElement);
      ShowMessage(s);
    end;
      

  3.   

    to:myy() 我用你写的那段代码,运行的时候抛出一个异常'the "http://www.w3.org/TR/WD-xsl" namespace is no longer supported in this version of MSXML ',这个namespace是个什么东西,我把它改成“abc”有抛出一个异常"Required attribute {http://www.w3.org/1999/XSL/Transform}version is missing",我再改成“http://www.w3.org/1999/XSL/Transform”又抛出“Required attribute version is missing”
    -->
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      

  4.   

    我做的是可以的,这是我的例子:
    ========================xml===============================
    <?xml version="1.0" encoding="GBK"?>
    <T Rows="10" Cols="5">
      <C key="C1">
        <C1 name="汉字" type="VARCHAR2"></C1>
        <C2 name="拼音" type="VARCHAR2"></C2>
        <C3 name="五笔" type="VARCHAR2"></C3>
        <C4 name="郑码" type="VARCHAR2"></C4>
        <C5 name="笔顺编号" type="VARCHAR2"></C5>
      </C>
      <R id="1">
        <C1>一</C1>
        <C2>yi</C2>
        <C3>ggll</C3>
        <C4>A</C4>
        <C5>1</C5>
      </R>
      <R id="2">
        <C1>丁</C1>
        <C2>ding</C2>
        <C3>sgh</C3>
        <C4>AI</C4>
        <C5>12</C5>
      </R>
      <R id="3">
        <C1>丂</C1>
        <C2>yu</C2>
        <C3>gnv</C3>
        <C4>AZVV</C4>
        <C5>15</C5>
      </R>
      <R id="4">
        <C1>七</C1>
        <C2>qi</C2>
        <C3>agn</C3>
        <C4>HD</C4>
        <C5>15</C5>
      </R>
    </T>
    ==================================xsl==============================
    <?xml version="1.0" encoding="GBK"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html" indent="yes"/>
      
      <xsl:template match="text()">
        <xsl:value-of select="." />
      </xsl:template>  <xsl:template match="/">
        <html>
          <head>
            <title>GBK Table</title>
            <meta http-equiv="Content-Type" content="text/html; charset=GBK" />
            <link type="text/css" rel="stylesheet" href="std.css"/>
            <script language="javascript" src="std.js"></script>
          </head>
          <body>
            <table>
              <thead>
                <xsl:apply-templates select="/T/C" />
              </thead>
              <!--tfoot>
                <xsl:apply-templates select="/T/C" />
              </tfoot-->
              <tbody>
                <xsl:apply-templates select="/T/R" />
              </tbody>
            </table>
          </body>
        </html>
      </xsl:template>
      
      <xsl:template match="C">
        <tr>
          <th width="10">
            <input type="checkbox" onclick="doCheck(this);" title="全选/清除" />
          </th>
          <xsl:for-each select="*">
            <th><xsl:value-of select="@name"/></th>
          </xsl:for-each>
        </tr>
      </xsl:template>
      
      <xsl:template match="R">
        <tr>
          <td align="center">
            <input type="checkbox" value="{./*[name()=string(/T/C/@key)]}" id="_UserSelect_" name="UserSelect" onclick="doCheck(this);" style="width:100%"></input>
          </td>
          <xsl:for-each select="*">
            <td><xsl:value-of select="." /></td>
          </xsl:for-each>
        </tr>
      </xsl:template></xsl:stylesheet>
      

  5.   

    忘了说,我的IE是 6.0.2800.1106 版本,自带MSXML3
      

  6.   

    找到错误了,是没有指定version属性的原因。但是,<xsl:stylesheet>这句写成<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">之后,发现在一条语句中报错“预期的句柄 'eof' 找到 '['。 .-->[<--value()$eq$0]”,这是因为我里面用了大量的取值判断语句:<xsl:when test=".[value()$eq$0]">abc</xsl:when>,难道是http://www.w3.org/1999/XSL/Transform命名空间不支持“.[value()$eq$0]”这种操作?但是我用http://www.w3.org/TR/WD-xsl命名空间却是可以的。
      

  7.   

    两种命名空间是有区别的(在IE中也是),好象http://www.w3.org/1999/XSL/Transform更严格一些,
    象<xsl:value-of select="." />后面的select"."都不能省略的。
      

  8.   

    那么在http://www.w3.org/1999/XSL/Transform命名空间下,我想实现上面的取一个值进行比较该如何实现?
    比如说我要比较当前节点的值是否与0相等,则在http://www.w3.org/TR/WD-xsl命名控件下是这样实现的
    <xsl:when test=".[value()$eq$0]">xxx</xsl:when>
      

  9.   

    niniu 系统里面有哪几个版本MSXML DOM?
      

  10.   

    寫一個數據庫表内容簡轉繁的函數!請高手指點http://community.csdn.net/Expert/topic/3773/3773051.xml?temp=.1970941
      

  11.   

    问题解决了,主要问题是两个:1)命名空间很重要,一个命名空间就相当于一个语法集,http://www.w3.org/TR/WD-xsl命名空间与http://www.w3.org/1999/XSL/Transform命名空间不完全兼容。2)delphi要使用MSXMLDom必须要调用Application.initialize和Application.Run,否则会在CreateDomDocument()的时候会抛出一个未调用CoInitialize(记得不是很清楚了)的异常。谢谢大家的解答,放分了。