XSLT 中使用参数和变量以及 C# 向 XSLT 传入参数
有时候我们需要向 XSLT 中设定或传入参数或变量,比如用 XSLT 从 RSS http://www.blogjava.net/Unmi/rss 取出前面若干条记录,那么这个记录数就应该作声明为参数。
http://www.blogjava.net/Unmi/rss 的文档结构如下:
<rss>
<channel>
<item>
<title>写第一个 Wordpress 插件程序</title>
<link>http://www.blogjava.net/Unmi/archive/2010/04/27/319398.html</link>
<dc:creator>隔叶黄莺</dc:creator>
<author>隔叶黄莺</author>
<pubDate>Mon, 26 Apr 2010 17:06:00 GMT</pubDate>
..............................................
</item>
<item>
.................................................
基于上面的需求,假定要前 5 条记录,XSLT 可以写成如下(c:\\Unmi_Rss_List.xslt):
上面我们用 <xsl:param name="rows" select="5"/> 定义了一个参数 rows,值为 5,在后面通过 $rows 来使用。
还用 <xsl:variable name="month" select="substring(pubDate,0,4)"/> 定义了一个变量 month,是用表达式(xslt 内置函数)赋的值,其实也可以赋为固定值,如 <xsl:variable name="month" select="Jul> ,然后也是用 $month 来引用。
使用代码输出转换后的结果,为方便起见还是放在 TestXslt.aspx 的 Page_Load() 中执行,因为可以直接把内容输出用网页浏览。
浏览页面 TestXslt.aspx,你会看到只输出了前面五条记录。
把上面 XSLT 中的 <xsl:param name="rows" select="5"/> 替换为 <xsl:varibale name="rows" select="5"/> 你也能得到同样的结果。好像 <xsl:param> 和 <xsl:varible> 差不多似的,其实他们是有区别的。
这样做法是在 XSLT 中自我实现了参数或变量定义,不同时候要修改 XSLT 中参数或变量的赋值。然而通常,我们要等到运行时才能确定参数值,所以需要能够在程序中向 XSLT 传入这个 rows 参数值,否则这样的 XSLT 也太不灵活了。OK,没问题,我们的 C# 代码应该带上 XsltArgumentList 来传入值:
XsltArgumentList 可以用 AddParam() 方法加入任何所需要的参数值。
执行下看看,没错,只显示了三条记录,而 XSLT 还是原来那个 XSLT,其中的 $rows=5 的值在运行时被代换为 $rows=3。
假如前面的 <xsl:param name="rows" select="5"/> 换成 <xsl:variable name="rows" select="5"/>,你再运行前一段代码,总是会显示 5 条记录,程序中传入的参数不管用了。
也就是 <xsl:variable name="rows" select="5"/> 像个局部变量定义,外部是无法撼动其值的。而 <xsl:param name="rows" select="5"/> 是个方法参数说明,5 只是 rows 的默认值。说到底,我们向 XSLT 中传入的是参数,而不是变量。
参考:1. Setting and Using Variables and Parameters
2. Date and time processing
3. Date/Time Processing
4. xsl:variable和xsl:param的区别
2 和 3 讲述了在 XSLT 中如何用内置或第三方定义的函数来处理日期,格式化输出等。 永久链接 https://yanbin.blog/xslt-csharp-use-parameter/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
http://www.blogjava.net/Unmi/rss 的文档结构如下:
<rss>
<channel>
<item>
<title>写第一个 Wordpress 插件程序</title>
<link>http://www.blogjava.net/Unmi/archive/2010/04/27/319398.html</link>
<dc:creator>隔叶黄莺</dc:creator>
<author>隔叶黄莺</author>
<pubDate>Mon, 26 Apr 2010 17:06:00 GMT</pubDate>
..............................................
</item>
<item>
.................................................
基于上面的需求,假定要前 5 条记录,XSLT 可以写成如下(c:\\Unmi_Rss_List.xslt):
1<?xml version="1.0" encoding="utf-8"?>
2<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
3
4 <xsl:output method="html" indent="yes"/><!--output html-->
5 <xsl:param name="rows" select="5"/><!--定义参数 rows, 并赋值为 5-->
6 <xsl:template match="/rss/channel">
7 <table align="center" style="border-collapse:collapse;border-color:black" border="1" >
8 <tr style="font-weight:bold"><td>标题</td><td>月份</td></tr>
9 <xsl:for-each select="item">
10 <xsl:if test="position() <= $rows"><!--使用 rows 参数,取前五条记录-->
11 <tr>
12 <td><xsl:value-of select="title"/></td>
13 <!--定义变量 month,用函数结果赋值-->
14 <xsl:variable name="month" select="substring(pubDate,0,4)"/>
15 <td><xsl:value-of select="$month"/></td><!--使用变量 month-->
16 </tr>
17 </xsl:if>
18 </xsl:for-each>
19 </table>
20 </xsl:template>
21</xsl:stylesheet>上面我们用 <xsl:param name="rows" select="5"/> 定义了一个参数 rows,值为 5,在后面通过 $rows 来使用。
还用 <xsl:variable name="month" select="substring(pubDate,0,4)"/> 定义了一个变量 month,是用表达式(xslt 内置函数)赋的值,其实也可以赋为固定值,如 <xsl:variable name="month" select="Jul> ,然后也是用 $month 来引用。
使用代码输出转换后的结果,为方便起见还是放在 TestXslt.aspx 的 Page_Load() 中执行,因为可以直接把内容输出用网页浏览。
1using System;
2using System.Xml.Xsl;
3using System.Xml;
4
5public partial class TestXslt : System.Web.UI.Page
6{
7 protected void Page_Load(object sender, EventArgs e)
8 {
9 XslCompiledTransform xslTrans = new XslCompiledTransform();
10
11 //enableDocumentFunction and enable script
12 XsltSettings settings = new XsltSettings(false, true);
13 xslTrans.Load("c:\\Unmi_Rss_List.xslt",settings, null);
14
15 //Write to Response directly
16 XmlTextWriter responseWriter = new XmlTextWriter(Response.Output);
17 xslTrans.Transform("http://www.blogjava.net/Unmi/rss", responseWriter);
18 }
19}浏览页面 TestXslt.aspx,你会看到只输出了前面五条记录。
| 标题 | 月份 |
| XSLT 文件中使用 C#/JScript/VB 自定义函数 | Sat |
| VS 2008中的jQuery Intellisense[转] | Wed |
| 使用 NAnt 构建 asp.net 项目并生成一个固定名字的动态库 | Sun |
| C# 使用 iTextSharp(5.0.2) 生成 PDF 文档 | Sat |
| C# 使用 iTextSharp(4.1.2) 生成 PDF 文档 | Sat |
把上面 XSLT 中的 <xsl:param name="rows" select="5"/> 替换为 <xsl:varibale name="rows" select="5"/> 你也能得到同样的结果。好像 <xsl:param> 和 <xsl:varible> 差不多似的,其实他们是有区别的。
这样做法是在 XSLT 中自我实现了参数或变量定义,不同时候要修改 XSLT 中参数或变量的赋值。然而通常,我们要等到运行时才能确定参数值,所以需要能够在程序中向 XSLT 传入这个 rows 参数值,否则这样的 XSLT 也太不灵活了。OK,没问题,我们的 C# 代码应该带上 XsltArgumentList 来传入值:
1using System;
2using System.Xml.Xsl;
3using System.Xml;
4
5public partial class TestXslt : System.Web.UI.Page
6{
7 protected void Page_Load(object sender, EventArgs e)
8 {
9 XslCompiledTransform xslTrans = new XslCompiledTransform();
10
11 //enableDocumentFunction and enable script
12 XsltSettings settings = new XsltSettings(false, true);
13 xslTrans.Load("c:\\Unmi_Rss_List.xslt",settings, null);
14
15 //Write to Response directly
16 XmlTextWriter responseWriter = new XmlTextWriter(Response.Output);
17 XsltArgumentList argList = new XsltArgumentList();
18 argList.AddParam("rows","",3);//改变主意了,只想要前三条
19 xslTrans.Transform("http://www.blogjava.net/Unmi/rss", responseWriter);
20 }
21}XsltArgumentList 可以用 AddParam() 方法加入任何所需要的参数值。
执行下看看,没错,只显示了三条记录,而 XSLT 还是原来那个 XSLT,其中的 $rows=5 的值在运行时被代换为 $rows=3。
假如前面的 <xsl:param name="rows" select="5"/> 换成 <xsl:variable name="rows" select="5"/>,你再运行前一段代码,总是会显示 5 条记录,程序中传入的参数不管用了。
也就是 <xsl:variable name="rows" select="5"/> 像个局部变量定义,外部是无法撼动其值的。而 <xsl:param name="rows" select="5"/> 是个方法参数说明,5 只是 rows 的默认值。说到底,我们向 XSLT 中传入的是参数,而不是变量。
参考:1. Setting and Using Variables and Parameters
2. Date and time processing
3. Date/Time Processing
4. xsl:variable和xsl:param的区别
2 和 3 讲述了在 XSLT 中如何用内置或第三方定义的函数来处理日期,格式化输出等。 永久链接 https://yanbin.blog/xslt-csharp-use-parameter/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。