当前位置: 首页 > 图文教程 > XML家族 > XML > 利用XSLT来换XML的根

XML
XML简易教程之四
XML与HTML的结合(上)
XML与HTML的结合(下)
XML入门的常见问题(一)
XML入门的常见问题(二)
XMLHTTP资料
什么是XML
什么是 XML Web Service
XML正在接管Web服务 成为SOA的基础
怎么样在网页上读取远程xml的数据
XML教程—编写结构完整的XML文档
读写xml文件的2个小函数
XML文档的基本操作
初学者如何开发出一个高质量的J2EE系统
优化 JavaScript 代码
自动更新程序的设计框架
使Firefox对XML的处理兼容IE的节点处理方法
WML学习之四 锚和任务
WML学习之五 显示表单
WML学习之六 事件

利用XSLT来换XML的根


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 65 ::
收藏到网摘: n/a

写程序需要换XML的根,感觉很不便,于是写了一个函数,大致思路及实现如下:

首先觉得利用XSLT还能过滤一些东西,然后再发送回客户端,所以决定采用XSLT

然后就是尝试写一个换根的XSL,如下

以下为引用的内容:

<?xml version="1.0" encoding="gb2312" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="gb2312" omit-xml-declaration="yes" indent="yes" />

<xsl:template match="/">
<NEWNODENAME>
    <xsl:apply-templates select="@* | node()" />
</NEWNODENAME>
</xsl:template>

<xsl:template match="@* | node()">
  <xsl:choose>
    <xsl:when test=".!=ancestor::node()"><xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy></xsl:when>
    <xsl:otherwise><xsl:apply-templates select="@* | node()"/></xsl:otherwise>
  </xsl:choose>
</xsl:template>

</xsl:stylesheet>

大致意思是,解析一个XML中的所有结点及属性,如果非根就直接拷贝,否则就查看是否存在子结点及属性。具体资料请参照MSXML的SDK文档。

然后写一个函数,使得NEWNODENAME可以指定:

这段代码为VB.Net中的实现,ASP中实现时需要注意对象附值需要用Set,还有返回值的问题

以下为引用的内容:

  Public Function ChangeXmlRootNodeName(ByRef oXml As MSXML2.DOMDocument, ByVal name As String) As String
    If oXml Is Nothing Then
      Return ""
    End If
    Dim sXslt As String
    sXslt = "<?xml version=""1.0"" encoding=""gb2312"" ?>" & vbCrLf
    sXslt = sXslt & "<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">" & vbCrLf
    sXslt = sXslt & "<xsl:output method=""xml"" version=""1.0"" encoding=""gb2312"" omit-xml-declaration=""yes"" indent=""yes"" />" & vbCrLf
    sXslt = sXslt & vbCrLf
    sXslt = sXslt & "<xsl:template match=""/"">" & vbCrLf
    sXslt = sXslt & "<" & name & ">"" & vbCrLf"
    sXslt = sXslt & "  <xsl:apply-templates select=""@* | node()""/>" & vbCrLf
    sXslt = sXslt & "</" & name & ">" & vbCrLf
    sXslt = sXslt & "</xsl:template>" & vbCrLf
    sXslt = sXslt & vbCrLf
    sXslt = sXslt & "<xsl:template match=""@* | node()"">" & vbCrLf
    sXslt = sXslt & "  <xsl:choose>" & vbCrLf
    sXslt = sXslt & "    <xsl:when test="".!=ancestor::node()""><xsl:copy><xsl:apply-templates select=""@* | node()""/></xsl:copy></xsl:when>" & vbCrLf
    sXslt = sXslt & "    <xsl:otherwise><xsl:apply-templates select=""@* | node()""/></xsl:otherwise>" & vbCrLf
    sXslt = sXslt & "  </xsl:choose>"" & vbCrLf"
    sXslt = sXslt & "</xsl:template>"" & vbCrLf"
    sXslt = sXslt & vbCrLf
    sXslt = sXslt & "</xsl:stylesheet>" & vbCrLf

    Dim oXsl As New MSXML2.DOMDocument
    oXsl.async = False
    oXsl.resolveExternals = False
    oXsl.loadXML(sXslt)

    Dim sXml As String

    sXml = oXml.transformNode(oXsl)

    sXml = AddXmlHeader(sXml)

 sXsl = Nothing

    Return sXml
  End Function

还有,当然你也可以实现生成那个XSL的XSL文件,这就要看你如何设计了。