请XSLT高手关注!不太好解决的问题!尤其!孟子★★★★★思归★★★★★请进!过客帮顶有分!

NIRVANAIII 2004-08-16 02:56:56
有XML文档,型如:
<ROOT>
<NODE ID="" PID="" VALUE="">M</NODE>
....
</ROOT>

用XSLT可以把他生成一棵树!


如下:
N
|---Y
|---4
|---5
|---M
|---6
|---7
|---1
|---2
|---3

现在是如何能让各个根节点的值等于其下所有叶子节点的值的总和!??
比如:

Y = 4 + 5 = 9
M = 6 + 7 = 13
N = Y + M + 1 + 2 + 3 = 9 + 13 + 1 + 2 + 3 = 28

要怎么写呢?

解决后再开200分答谢!!
...全文
263 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
dsclub 2004-08-17
  • 打赏
  • 举报
回复
我想了一下如果要是用一个XSLT格式化到一个 狼兄 说的XML,再XSLT的话

那还不如当初就把XML直接构造成那样!


当然本人水平有限!

在此也希望能看到更好的答案
dsclub 2004-08-17
  • 打赏
  • 举报
回复
解出来了!!!!

靠,累死我了!(还是自己太笨!)

XSLT实现XML无极限树(精简版)[二] 解决没有递归出节点属性值总和的问题(JS实现)
http://www.cnblogs.com/dsclub/archive/2004/08/16/33959.aspx

XML数据源文件和第一版的一样!
这个XSLT解决没有递归出节点属性值总和的问题
不过是借助JS实现的
不管怎么样,问题算是解决了!

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 这个名称空间可以使用output,但是IE5不可解析 -->
<!-- 推荐使用环境,MSIE6,MSXML4.0 -->
<xsl:output method="html" version="4.0" encoding="GB2312" />
<xsl:template match="/">
<html>
<head>
<title>XMLTREE</title>
<style>
<xsl:comment>
<![CDATA[
h1
{
display:list-item;
padding:2px;
list-style:none;
}
span.clsP
{
list-style-type:square;
color:#222;
}
span.clsC
{
list-style-type:disc;
color: #00b;
}
span
{
padding: 2px;
font: 9pt;
cursor: default;
text-decoration:none;
margin: 0px;
margin-left: 16px;
}
div
{
margin-left: 18px;
border-left: 1px solid #ddd;
border-bottom:1px solid;
border-bottom-color:expression(document.bgColor);
display:block;
} ]]>
</xsl:comment>
</style>
</head>
<body onselectstart="return false;">
<xsl:call-template name="NextPID">
<xsl:with-param name="mPID">-1</xsl:with-param>
<xsl:with-param name="mNum">0</xsl:with-param>
</xsl:call-template>
</body>
<script language="javascript">
<xsl:comment>
<![CDATA[
//************************************************
//
// 解决没有递归出节点属性值总和的问题
//
//************************************************

var i, j, nodesum;

//因为提前把一个根下的所有孩子都方在一个DIV内
//所以把这些DIV都找出来就可以找到一个根下的所有孩子了
var objs = document.body.getElementsByTagName("DIV");

for(i = 0; i < objs.length; i++)
{
var obj = objs[i];

// 找到这些孩子的父亲
var nobj = document.getElementById("snode" + obj.id.replace("node",""));

// 初始根节点下孩子总和的值为此节点附有的同属性的值
nodesum = parseInt(nobj.mc, 10);

// 所有带有目标属性的同宗的孩子
var spanobjs = obj.getElementsByTagName("SPAN");

for(j in spanobjs)
{
if(spanobjs[j].mc) // 去除一些干扰
nodesum += parseInt(spanobjs[j].mc, 10); // 累加
}
// 可以写祖宗的innerText了!成功!
nobj.innerText += "(" + (nodesum) + ")";

}

// 就这样,把所有需要计算的东西都放到Client去做
// 服务器应该尽可能闲下来休息一下的
]]>
</xsl:comment>
</script>
</html>
</xsl:template>
<xsl:template name="NextPID">
<xsl:param name="mPID" />
<xsl:param name="mNum" />
<xsl:for-each select="//Troot/Item[@pid = $mPID]">
<xsl:sort select="count(//Troot/Item[@pid = current()/@id])" order="descending" data-type="number" />
<!-- 首先按拥有孩子的数量来排序 -->
<xsl:sort select="@id" order="ascending" />
<xsl:choose>
<xsl:when test="count(//Troot/Item[@pid = current()/@id]) > 0">
<!-- 有孩子的节点 -->
<h1>
<span class="clsP">
<xsl:attribute name="id">snode<xsl:value-of select="@id" /></xsl:attribute>
<xsl:attribute name="mc">
<xsl:value-of select="@c" />
</xsl:attribute>
<xsl:value-of select="." />
<!-- [下属节点数:<xsl:value-of select="format-number(count(//Troot/Item[@pid = current()/@id]),'00')" />] -->
</span>
</h1>
<div>
<xsl:attribute name="id">node<xsl:value-of select="@id" /></xsl:attribute>
<xsl:call-template name="NextPID">
<xsl:with-param name="mPID">
<xsl:value-of select="@id" />
</xsl:with-param>
<xsl:with-param name="mNum">
<xsl:value-of select="$mNum + @c" />
</xsl:with-param>
</xsl:call-template>
</div>
</xsl:when>
<xsl:otherwise>
<!-- 孤单的节点 -->
<h1>
<span class="clsC">
<xsl:attribute name="snode">
<xsl:value-of select="@id" />
</xsl:attribute><xsl:attribute name="mc">
<xsl:value-of select="@c" />
</xsl:attribute>
<xsl:value-of select="." />(<xsl:value-of select="@c" />)
</span>
</h1>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
<!-- 最终版权归 DSclub(任兀)拥有,您可以在未授权的情况下使用,但请保留此信息 -->
<!--
EMail:dsclub@hotmail.com
QQ:9967030
Nick Name: DSclub(兀儿-干部)
姓名:任兀
性别:男生(未婚哦)
-->


蒋健华 2004-08-17
  • 打赏
  • 举报
回复
学习了
yonghengdizhen 2004-08-17
  • 打赏
  • 举报
回复
如果你是自底向上构造树的,在构造树的同时进行求和.
phoubes 2004-08-17
  • 打赏
  • 举报
回复
XML本身就设计不好了吧,不要采用这样的设计,采用树型设计比较好.
NIRVANAIII 2004-08-17
  • 打赏
  • 举报
回复
再等等还有别人的答案么…………

先给 干部 兄200分!
patchclass 2004-08-17
  • 打赏
  • 举报
回复
狼兄 的xml已经构造完善了
我想不指望可以用xslt写出真正的函数来,他本来就不是程序的
qwater 2004-08-17
  • 打赏
  • 举报
回复
up
NIRVANAIII 2004-08-17
  • 打赏
  • 举报
回复
呵呵,多谢啦!!!


我先下去看看!
nchen123 2004-08-17
  • 打赏
  • 举报
回复
xquery 值得大家关注
dsclub 2004-08-17
  • 打赏
  • 举报
回复
xxrl

那个是你的马甲么?
超级大笨狼 2004-08-17
  • 打赏
  • 举报
回复
习惯关系型数据库的人可能会这么设计,楼主是不是还希望xml有select * from 之类的语句啊?
blues-star 2004-08-17
  • 打赏
  • 举报
回复
FT,还是要用script?
nchen123 2004-08-16
  • 打赏
  • 举报
回复
哦,不用我贴了, 刚刚想贴。 我这个帖子的地址是:

http://community.csdn.net/Expert/topic/2993/2993157.xml?temp=.777218
dsclub 2004-08-16
  • 打赏
  • 举报
回复
To:超狼

我觉得这样出来的XML体积很小,也有一定的可取性……
dsclub 2004-08-16
  • 打赏
  • 举报
回复
想到2个解法:

1、XSLT到->狼兄介绍的那个XML,再用sum()计算全部VALUE的总和!

2、对当前的XSLT后的HTML,进行JS求得VALUE的和...
超级大笨狼 2004-08-16
  • 打赏
  • 举报
回复
这个是inelm的简单树模型。
超级大笨狼 2004-08-16
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="GB2312" ?>
<?xml-stylesheet type="text/xsl" href="tree.xsl" ?>
<tree>
<node title="中国">
<node title="江苏">
<node title="泰州">
<node title="白马" />
</node>
<node title="徐州" />
<node title="南京" />
<node title="无锡" />
</node>
<node title="上海">
<node title="徐家汇" />
<node title="莘庄" />
<node title="中山公园" />
</node>
<node title="北京" />
<node title="四川" />
<node title="海南" />
</node>
<node title="米国">
<node title="加利福利亚" />
<node title="纽约" />
</node>
<node title="伊拉克" />
</tree>






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

<xsl:template match="node">
<div>
<span onclick="toggle(this)" class="mark">
<xsl:choose>
<xsl:when test="count(*)>0">
─</xsl:when>
<xsl:otherwise>
·</xsl:otherwise>
</xsl:choose>
</span>
<span>
<xsl:value-of select="@title" />
</span>
</div>
<div class="indent">
<xsl:apply-templates select="./node" />
</div>
</xsl:template>
</xsl:stylesheet>



<style>
body
{
background-color: #eeeeee;
font-size:14;
}
div
{
cursor:hand;
}
div.indent
{
padding-left: 30;

}

span
{
border:1px solid;
border-color:#999999;
font-size:14;
height:18;
}
span.mark
{
width:15;
height:15;
text-align:center;
border:1px solid;
border-color:#999999;
font-size:10;
background-color:white;

}
</style>

<SCRIPT >

function toggle(s)
{
var d = s.parentElement.nextSibling;
if (d.childNodes.length > 0)
{
if (d.style.display == '')
{
d.style.display = 'none';
s.innerText = '┼';
}
else
{
d.style.display = '';
s.innerText = '─';
}
}
}

function document.onselectstart()
{
document.selection.clear();
}

var xmldoc, xsldoc;
xmldoc = new ActiveXObject("Microsoft.XMLDOM");
xmldoc.async = false;
xmldoc.load("tree.xml");
xsldoc = new ActiveXObject("Microsoft.XMLDOM");
xmldoc.async = false;
xsldoc.load("tree.xsl");

document.write('<div id="tree">' + xmldoc.transformNode(xsldoc) + '</div>');

</SCRIPT>
超级大笨狼 2004-08-16
  • 打赏
  • 举报
回复
<ROOT>
<NODE ID="1" PID="0" VALUE="0">N</NODE>
<NODE ID="2" PID="1" VALUE="0">Y</NODE>
<NODE ID="3" PID="1" VALUE="0">M</NODE>
<NODE ID="4" PID="1" VALUE="0">N</NODE>
<NODE ID="5" PID="1" VALUE="1">.</NODE>
<NODE ID="6" PID="1" VALUE="2">.</NODE>
<NODE ID="7" PID="1" VALUE="3">.</NODE>
<NODE ID="8" PID="2" VALUE="4">.</NODE>
<NODE ID="9" PID="2" VALUE="5">.</NODE>
<NODE ID="10" PID="3" VALUE="6">.</NODE>
<NODE ID="11" PID="3" VALUE="7">.</NODE>
</ROOT>

这么构造父子关系根本就是不合理的。
dsclub 2004-08-16
  • 打赏
  • 举报
回复
搞了半天了,不过暂时也还没有在递归中一并实现把VALUE的值计算出来,XSLT对Variable的规定不同于一般程序设计语言的里“变量”的概念!一旦定义就不能再次赋值了!


所以是有点不好搞定!

不过,我比较赞同 runmin(来了3年多~.~) 的观点,实在不好用XSLT实现,就用JS再后期处理一下,做程序要变通的,前两天这里还有EStyle的贴子就是说变通的呀。

我会一直关注的!
加载更多回复(12)

28,390

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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