XML如下:
<?xml version="1.0" encoding="utf-8"?>
<PERSONS>
  <TableA>
    <PERSON>
      <userid CheckMsg="">1</userid>
      <name CheckMsg="">Allen</name>
      <age CheckMsg="">1232</age>
    </PERSON>
  </TableA>
</PERSONS>我想在通过XSLT转换时来判断,例如userid =1,如果此时userid 的值不是数字时,应该在它的属性CheckMsg="wrong"
请问能实现此功能的XSLT该怎么写?

解决方案 »

  1.   

    并且通过XSLT转换以后还是输出一个XML,只是会在CheckMsg属性上写上内容
      

  2.   

    可以写个方法判断:public string Check(string str)
    {
        if(int.TryParse(str,0) > 0)  //转化为数字成功,则
             retrun str;   //返回1
        else
             return "wrong";           
    }我的例子:
    ===================================================================================
    xsl文件,注意加了xmlns:DateTimeConverter="urn:DateTimeConverter",select="DateTimeConverter:ToDateTimeFormat....<?xml version="1.0" encoding="gb2312"?><xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:DateTimeConverter="urn:DateTimeConverter">
    有效期:<xsl:value-of select="DateTimeConverter:ToDateTimeFormat(ExpiredType,ExpiredDate)"/>
    ===================================================================================
    DateTimeConverter.cs文件:
    public class DateTimeConverter
    {
        public string ToDateTimeFormat(string str1, string str2)
        {
            if (str1 == "1" && Convert.ToDateTime(str2).ToShortDateString() == "2010-11-11")
                return "常年有效";
            else
                return Convert.ToDateTime(str2).ToShortDateString();
        }
    }
    ===================================================================================//把XML数据按指定的xsl格式文件转化成字符串表示.
        public string XmlToString(XmlDocument xml, string filePath)
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.OmitXmlDeclaration = true;//编写xml声明
            settings.ConformanceLevel = ConformanceLevel.Fragment;//设置xml文件符合的一致性级别
            settings.CloseOutput = false;//settings关闭时不关闭基础流
            StringBuilder sb = new StringBuilder();//需要输出的字符串类
            TextWriter tw = new StringWriter(sb);
            XmlWriter xw = XmlWriter.Create(tw, settings);
            XslCompiledTransform xst = new XslCompiledTransform();
            //加载格式化文件
            string str = HttpContext.Current.Request.ApplicationPath + "/" + filePath;
            xst.Load(HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath + "/" + filePath));
            //关键是下面这几句//
            XsltArgumentList argsList = new XsltArgumentList();
            DateTimeConverter converter = new DateTimeConverter();
            argsList.AddExtensionObject("urn:DateTimeConverter", converter);  //DateTimeConverter为上面的类
            //关键是上面这几句 //        xst.Transform(xml, argsList, xw);//把转换的结果输出到sb中
            return sb.ToString();
        }
      

  3.   

    上面Check方法写错了,改为public string Check(string str)
        {
            int result = 0;
            if (int.TryParse(str, out result))  //转化为数字成功,则
                return str;  //返回1
            else
                return "wrong";
        }
      

  4.   

    我用你的方法试了,但是输出的XML没变化,XML还是之前的XML
      

  5.   

    XSL:
    <?xml version="1.0" encoding="utf-8"?><xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" encoding="utf-8"/>


    <xsl:template match="/">
    <xsl:element name="PERSONS">
    <xsl:element name="TableA">
    <xsl:element name="PERSON">
    <xsl:element name="userid"><xsl:value-of select="/PERSONS/TableA/PERSON/userid"/></xsl:element>
    <xsl:element name="name"><xsl:value-of select="/PERSONS/TableA/PERSON/name"/></xsl:element>
    <xsl:element name="age"><xsl:value-of select="/PERSONS/TableA/PERSON/age"/></xsl:element>
        <xsl:element name="error">it is not correct</xsl:element>
    </xsl:element>
    </xsl:element>
    </xsl:element>
    </xsl:template></xsl:stylesheet> 
      

  6.   

    XML:<?xml version="1.0" encoding="utf-8"?>
    <PERSONS>
      <TableA>
        <PERSON>
          <userid>1</userid>
          <name>Allen</name>
          <age>28</age>
        </PERSON>
        <PERSON>
          <userid>2</userid>
          <name>Keni</name>
          <age>28</age>
        </PERSON>
        <PERSON>
          <userid>3</userid>
          <name>Jimmy</name>
          <age>28</age>
        </PERSON>
        <PERSON>
          <userid>4</userid>
          <name>dfd</name>
          <age>23</age>
        </PERSON>
        <PERSON>
          <userid>5</userid>
          <name>dfdf</name>
          <age>26</age>
        </PERSON>
        <PERSON>
          <userid>6</userid>
          <name>qq</name>
          <age>26</age>
        </PERSON>
        <PERSON>
          <userid>7</userid>
          <name>ss</name>
          <age>28</age>
        </PERSON>
        <PERSON>
          <userid>8</userid>
          <name>uu</name>
          <age>21</age>
        </PERSON>
      </TableA>
    </PERSONS>
      

  7.   

    后台代码:
    XmlWriterSettings settings = new XmlWriterSettings();
            settings.OmitXmlDeclaration = true;
            settings.ConformanceLevel = ConformanceLevel.Fragment;
            settings.CloseOutput = false;
            StringBuilder sb = new StringBuilder();
            TextWriter tw = new StringWriter(sb);
            XmlWriter xw = XmlWriter.Create(tw, settings); 
          
            XPathDocument xdoc = new XPathDocument(@"C:\Documents and Settings\Administrator\CSBDemo\test.xml");
            XslCompiledTransform trans = new XslCompiledTransform();
            trans.Load(@"C:\Documents and Settings\Administrator\CSBDemo\XSLTFile.xsl");        trans.Transform(xdoc, null, xw);
            xw.Close();
      

  8.   

    xsl:
    <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:XslCheck="urn:XslCheck">
      
      <xsl:output method="xml" encoding="utf-8"/> 
    <xsl:template match="/"> 
    <xsl:element name="PERSONS"> 
    <xsl:element name="TableA"> 
    <xsl:element name="PERSON"> 
    <xsl:element name="userid">
      <xsl:attribute name="CheckMsg">
        <xsl:value-of select="XslCheck:Check(/PERSONS/TableA/PERSON/userid)"/>
      </xsl:attribute>
         <xsl:value-of select="/PERSONS/TableA/PERSON/userid" /> </xsl:element> 
    <xsl:element name="name">
      <xsl:attribute name="CheckMsg">
        <xsl:value-of select="XslCheck:Check(/PERSONS/TableA/PERSON/name)"/>
      </xsl:attribute>
      <xsl:value-of select="/PERSONS/TableA/PERSON/name"/> </xsl:element> 
    <xsl:element name="age">
      <xsl:attribute name="CheckMsg">
        <xsl:value-of select="XslCheck:Check(/PERSONS/TableA/PERSON/age)"/>
      </xsl:attribute>
      <xsl:value-of select="/PERSONS/TableA/PERSON/age"/> </xsl:element> 
        <xsl:element name="error">it is not correct </xsl:element> 
    </xsl:element> 
    </xsl:element> 
    </xsl:element> 
    </xsl:template> </xsl:stylesheet> 
      

  9.   

    XslCheck.cs:
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    public class XslCheck
    {
        public string Check(string str)
        {
            int result = 0;
            if (int.TryParse(str, out result))  //转化为数字成功,则
                return str;  //返回原来的数,根据实际情况设置
            else
                return "wrong";
        }
    }
      

  10.   

    后台代码: using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;using System.Xml;
    using System.Xml.Xsl;
    using System.Text;
    using System.Xml.XPath;
    using System.IO;public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.OmitXmlDeclaration = true;//编写xml声明
            settings.ConformanceLevel = ConformanceLevel.Fragment;//设置xml文件符合的一致性级别
            settings.CloseOutput = false;//settings关闭时不关闭基础流
            StringBuilder sb = new StringBuilder();//需要输出的字符串类
            TextWriter tw = new StringWriter(sb);
            XmlWriter xw = XmlWriter.Create(tw, settings);    
            
            XslCompiledTransform xst = new XslCompiledTransform();
            xst.Load(HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath + "/" + "XSLTFile.xsl"));        XsltArgumentList argsList = new XsltArgumentList();
            XslCheck check = new XslCheck();
            argsList.AddExtensionObject("urn:XslCheck", check);
            XmlDocument xml = new XmlDocument();
            xml.Load(Server.MapPath("~/test.xml"));//加载数据
            xst.Transform(xml, argsList, xw);             
            Response.Write(Server.HtmlEncode(sb.ToString()));//测试输出    }
    }最终生成的结果:<PERSONS><TableA><PERSON><userid CheckMsg="1 ">1 </userid><name CheckMsg="wrong">Allen </name><age CheckMsg="28 ">28 </age><error>it is not correct </error></PERSON></TableA></PERSONS>