XSLT 怎样传送参数

Tasehouny 2003-08-10 07:47:41
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="Person-PersonId" match="//DeptFolder[@DeptId='54']//Person" use="@PersonID" />
</xsl:stylesheet>

想把 54 替换成参数,但好像在方括号中写参数不行??

...全文
99 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tasehouny 2003-08-11
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="utf-8"?>
<MailAddrBook TimeStamp="37841.9912848264" Guid="e4dd9bf9-2bf0-4a6b-94ec-98745a4e66df" PersonId="47003">
<DeptFolder DeptId="54" DeptName="董事会">
<DeptFolder DeptId="57" DeptName="有个问题啊" />
<DeptFolder DeptId="58" DeptName="添加新项目测试">
<Person PersonName="1" PersonID="1" PosName="89" />
<Person PersonName="Ahui" PersonID="47035" PosName="89" />
<DeptFolder DeptId="59" DeptName="茂大婶专用">
<DeptFolder DeptId="61" DeptName="啊啊啊啊">
<Person PersonName="momm" PersonID="47036" PosName="102" />
<Person PersonName="Ahui" PersonID="47035" PosName="102" />
<DeptFolder DeptId="62" DeptName="没有没有" />
<DeptFolder DeptId="63" DeptName="积极匝匝" />
<DeptFolder DeptId="64" DeptName="没有花香" />
</DeptFolder>
</DeptFolder>
</DeptFolder>
<DeptFolder DeptId="61" DeptName="啊啊啊啊">
<Person PersonName="Ahui" PersonID="47035" PosName="102" />
<Person PersonName="momm" PersonID="47036" PosName="102" />
<DeptFolder DeptId="62" DeptName="没有没有" />
<DeptFolder DeptId="63" DeptName="积极匝匝" />
<DeptFolder DeptId="64" DeptName="没有花香" />
</DeptFolder>
</DeptFolder>
</MailAddrBook>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="Person-PersonName" match="//DeptFolder[@DeptId='54']//Person" use="@PersonName" />
<xsl:template match="//DeptFolder[@DeptId='54']" >
<xsl:for-each select=".//Person[count(. | key('Person-PersonName', @PersonName)[1]) = 1]">
<xsl:sort select="@PersonID" />
<xsl:value-of select="@PersonName" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

想把 54 用参数来代替,通过设置不同的参数来选择不同节点的子孙 Person 节点
Tasehouny 2003-08-11
  • 打赏
  • 举报
回复
十分感谢
saucer 2003-08-11
  • 打赏
  • 举报
回复
I don't what you want that for, but if you want to iterate through them, try

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="Person-PersonName" match="Person" use="@PersonName" />
<xsl:template match="MailAddrBook">
<table border="1">
<xsl:for-each select="//DeptFolder[not(@DeptId = preceding::DeptFolder/@DeptId)]">
<tr>
<td><xsl:value-of select="@DeptId" /></td>
<td>
<xsl:apply-templates select="." />
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>

<xsl:template match="DeptFolder" >
<xsl:for-each select=".//Person[count(. | key('Person-PersonName', @PersonName)[1]) = 1]">
<xsl:sort select="@PersonID" />
<xsl:value-of select="@PersonName" />,
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>


if you just want the output for one particular @DeptId, try

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:param name="DeptId" select="54" />
<xsl:key name="Person-PersonName" match="Person" use="@PersonName" />
<xsl:template match="MailAddrBook">
<xsl:apply-templates select="DeptFolder[@DeptId=$DeptId]" />
</xsl:template>
<xsl:template match="DeptFolder" >
<xsl:for-each select=".//Person[count(. | key('Person-PersonName', @PersonName)[1]) = 1]">
<xsl:sort select="@PersonID" />
<xsl:value-of select="@PersonName" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>


and you can change the value for the parameter from outside:

using System;
using System.Xml;
using System.Xml.Xsl;

class TestAli
{
public static void Main()
{
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load("TestAli.xml");

XslTransform xslt = new XslTransform();
xslt.Load("TestAli.xsl");

string sID = "62";
XsltArgumentList xslArg = new XsltArgumentList();
xslArg.AddParam("DeptId", "", sID);

XmlTextWriter writer = new XmlTextWriter(Console.Out);

xslt.Transform(xmldoc, xslArg, writer);

writer.Close();
}
}

saucer 2003-08-10
  • 打赏
  • 举报
回复
show your xml and tell us what you want
Tasehouny 2003-08-10
  • 打赏
  • 举报
回复
给个例子? 好吗? 初学 XSLT 还请多多关照!
saucer 2003-08-10
  • 打赏
  • 举报
回复
do the test in other places
Tasehouny 2003-08-10
  • 打赏
  • 举报
回复
那么如果像我这样的需求,如何实现呢?

saucer 2003-08-10
  • 打赏
  • 举报
回复
variables cannot be used with that expression
madong 2003-08-10
  • 打赏
  • 举报
回复
不会吧,在方括号有定是可以的,下面是写的一个例子,但愿能给你一点提醒:
<xsl:apply-templates select="person[@type='daily']"/>

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧