K_Reverter的网页开发记录

要么不做,要么就当作艺术品来做!

导航

[导入]关于怎样通过xslt向.NET扩展函数传递OuterXml属性

    根据我以前对这个系统的描述,比如选择题,在试题的配置文件中存在差不多是以下的xmlNode

<question sql="select ***"><title>选择题题干</title></question>


    在通过xslt转换的时候,我期望将question的OuterXml作为.NET语言的函数参数去处理,该.NET函数分析此question节点并根据设置从数据库中取出数据,并返回。
    可是我在网上找了两天,都没有找到相关的东西,并且在网上有很多人说是应该不能实现,本来在网上有一种说法,说是用如下方法:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl
="urn:schemas-microsoft-com:xslt"
                xmlns:user
="http://mycompany.com/mynamespace"
                version
="1.0">
  
<msxsl:script language="JScript" implements-prefix="user">
    function xml(nodelist) {
      return nodelist.nextNode().xml;
    }
  
</msxsl:script>
  
  
<xsl:template match="/">
    
<xsl:value-of select="user:xml(.)"/>
  
</xsl:template>
</xsl:stylesheet>

 

可是我测试没有成功,提示说:
    详细信息: Microsoft.JScript.JScriptException: 应输入函数

后来又从网上找了相关资料,好像说在.NET中不能使用,所以我只能放弃这个方法(主要是我实在没有时间研究了,呵呵),后来我终于“曲线救国”,通过一个变态的方法解决了这个问题,方法如下(本人不能确认这是比较好的方法,仅作参考用,有什么好的办法也可以提供给我,谢谢)

在我的xslt文件部分代码如下(原理就是通过xslt对xml的转换迭代过程将xml节点内容一个一个发送给xslt扩展):

<xsl:template match="/exam/questionGroups/*">
<!--开始接收节点-->
 
<xsl:value-of disable-output-escaping="yes" select="WebExam:StartSetting(name(.))"/>
<!--发送节电的所有内容-->
 
<xsl:apply-templates select="@* | node()"/>
<!--完成结点内容发送并运行该扩展函数-->
 
<xsl:value-of disable-output-escaping="yes" select="WebExam:GetResult()"/>
</xsl:template>
 
<!--发送所需节点下的人以子节点-->
<xsl:template match="/exam/questionGroups/*//*">
<!--开始一个节点发送-->
 
<xsl:value-of disable-output-escaping="yes" select="WebExam:SendElement(name(.))"/>
<!--发送节点内容-->
 
<xsl:apply-templates select="@* | node() | text()"/>
<!--完成发送该节点-->
 
<xsl:value-of disable-output-escaping="yes" select="WebExam:EndElement()"/>
</xsl:template>
  
<!--发送节点或子节点中的文本内容-->
  
<xsl:template match="/exam/questionGroups/*//text()">
  
<xsl:value-of disable-output-escaping="yes" select="WebExam:SetElementValue(string(.))"/>
  
</xsl:template>
  
<!--发送节点或子节点的属性-->
  
<xsl:template match="/exam/questionGroups/*//@*">
    
<xsl:value-of disable-output-escaping="yes" select="WebExam:SendAttribute(name(.),string(.))"/>
  
</xsl:template>

在我的.NET中,用来作为xslt扩展的对象为(将从xslt发送的内容还原成一个节点):

 

public class Run
{
 XmlDocument xmlDocument
=new
 XmlDocument();
//xmlNode表示发送过来的根节点,xmlNode表示当前操作的节点

 XmlNode xmlNode,xmlNode1;
//开始接受节点数据

 public void StartSetting(string elementName)
 
{
  xmlNode
=
xmlDocument.CreateElement(elementName);
  xmlNode1
=
xmlNode;
 }

//开始接收一个节点,以后接收的属性和子节点都将附加到这个新节点
 public void SendElement(string elementName)
 
{
  XmlNode n
=
xmlDocument.CreateElement(elementName);
  xmlNode1.AppendChild(n);
  xmlNode1
=
n;
 }

//开始接收一个节点,以后接收的属性和子节点都将附加到这个节点的父节点
 public void EndElement()
 
{
  xmlNode1
=
xmlNode1.ParentNode;
 }

//接收和附加一个属性
 public void SendAttribute(string Name,string Value)
 
{
  XmlAttribute xmlAttribute
=
xmlDocument.CreateAttribute(Name);
  xmlAttribute.Value
=
Value;
  xmlNode1.Attributes.Append(xmlAttribute);
 }

//接收和附加一个文本内容
 public void SetElementValue(string text)
 
{
  xmlNode1.InnerText
=
text;
 }


 
public string GetResult()
 
{
/*

-----------------在这儿对节点进行操作---------------------
*/

  
return xmlNode.OuterXml;
 }

}


    这样就实现了操作xmlNode的功能
    想要使用这个xslt扩展,只要通过AddExtensionObject添加到transform就可以了,比如:

 XsltArgumentList xslArg = new XsltArgumentList();
 Run obj 
= new
 Run();
 xslArg.AddExtensionObject(
"urn:WebExam"
, obj);
 xslt.Transform(doc,xslArg,Response.Output,
null);

posted on 2005-03-09 17:02  K_Reverter  阅读(226)  评论(0编辑  收藏  举报