在 xsl 中如何在select中使用变量?
比如:
---------------------------------------------------
<?xml-stylesheet type="text/xsl" href="std.xsl"?>
<?xml version="1.0" encoding="GBK"?>
<T>
<C key="C1">
<C1 name="汉字"></C1>
<C2 name="拼音"></C2>
</C>
<R id="1">
<C1>一</C1>
<C2>yi</C2>
</R>
<R id="2">
<C1>丁</C1>
<C2>ding</C2>
</R>
</T>
---------------------------------------------------
<xsl:variable name="KeyCol" select="/T/C/@key" />
<!--KeyCol的值指出C1,C2谁是主键-->
...
<xsl:template match="R">
<tr>
<td align="center">
<input type="checkbox>
<xsl:attribute name="value">
<xsl:value-of select="./$KeyCol"/>
<!--在这里我想把KeyCol的值'C1'作为选择节点的表达式-->
</xsl:attribute>
</input>
</td>
<xsl:for-each select="*">
<td><xsl:value-of select="." /></td>
</xsl:for-each>
</tr>
</xsl:template>
问题点数:100、回复次数:18Top
1 楼myy()回复于 2005-01-06 09:53:14 得分 0
xsl:value-of select="$KeyCol"/> 这样也不对,得到的checkbox的value直接为'C1'Top
2 楼zhmt(孜风)回复于 2005-01-06 10:01:30 得分 100
可以直接用js去修改要使用变量的结点的属性值的
给你的包含xsl代码的xml结点一个id属性xslId
然后可以直接这样:
var node = xslId.selectSingleNode("//td/input/xsl:attribute/");
node.text = "像要赋的值";Top
3 楼zhmt(孜风)回复于 2005-01-06 10:02:51 得分 0
我感觉把谁是key放到xml中来处理更好啊Top
4 楼zhmt(孜风)回复于 2005-01-06 10:06:56 得分 0
<xsl:value-of select="./$KeyCol"/>
为什么不直接用<xsl:value-of select="//T/C/@key"/>呢?Top
5 楼myy()回复于 2005-01-06 10:09:34 得分 0
谢谢楼上关注。
>>我感觉把谁是key放到xml中来处理更好啊
为了减小xml的大小,把C1,C2的相信息集中放在<C></C>中,
<C>...</C>可以看作“"字段”的描述信息。
下面的<R>...</R>其实就是一个个的“记录”。Top
6 楼zhmt(孜风)回复于 2005-01-06 10:10:30 得分 0
$KeyCol中存放的为C1所以输出出来也就是C1,
换成这样:
判断$KeyCol存放的是否为C1,是,就输出C1结点的值;不是,你自己处理Top
7 楼myy()回复于 2005-01-06 10:14:21 得分 0
直接用<xsl:value-of select="//T/C/@key"/>也不对,
我要的是T/C/@key的值'C1'在每个<R>...</R>中相应的<C1></C1>的内容,
比如'一','丁',让后放在当前的checkbox的value,
如果T/C/@key的值是'C2',当前checkbox的value就是'yi','ding'Top
8 楼zhmt(孜风)回复于 2005-01-06 10:22:40 得分 0
我知道了
这样把:输出value之前判断T/C/@key中的值,为C1,输出“C1结点”的值
<xsl:if test="./$KeyCol='C1'">
<xsl:value-of select="C1"/>
</xsl:if>
<xsl:if test="./$KeyCol='C2'">
<xsl:value-of select="C2"/>
</xsl:if>Top
9 楼myy()回复于 2005-01-06 10:30:59 得分 0
这样不太好吧?我的C1,C2...个数并不是固定的呀。Top
10 楼zhmt(孜风)回复于 2005-01-06 10:35:19 得分 0
我觉得这样更好一点:
<T>
<R id="1">
<CC key='true'>一</CC>
<CC>yi</CC>
</R>
<R id="2">
<CC key='true'>丁</CC>
<CC>ding</CC>
</R>
</T>
对每条记录,输出(属性key的为true的)结点值Top
11 楼myy()回复于 2005-01-06 10:42:39 得分 0
为了减小xml的大小,把C1,C2...的相信息集中放在<C></C>中,
其实,每个"字段"的相关信息比较多的,不光key,还有显示名,类型,精度...等,
在记录中会无意义的重复很多次。
Top
12 楼zhmt(孜风)回复于 2005-01-06 10:46:15 得分 0
也可以这样,
<T>
<C key="1">
<C1 name="汉字"></C1>
<C2 name="拼音"></C2>
</C>
<R id="1">
<CC key='true'>一</CC>
<CC>yi</CC>
</R>
<R id="2">
<CC key='true'>丁</CC>
<CC>ding</CC>
</R>
</T>
<xsl:for-each select="/T/R">
<xsl:for-each select="CC">
<xsl:if test="positon()=number(././C/@key)">
<xsl:value-of select="." />
</xsl:if>
</xsl:for-each>
</xsl:for-each>Top
13 楼zhmt(孜风)回复于 2005-01-06 10:51:25 得分 0
呵呵,按你现在的XML,你可以遍历R下的所有结点
看看结点名字(name()用获得)是否等于KeyCol,相等的话,输出该结点的值 就可以了Top
14 楼zhmt(孜风)回复于 2005-01-06 10:58:17 得分 0
基本就是下面这样,你调试一下
<input type="checkbox>
<xsl:attribute name="value">
<xsl:if test="./$KeyCol=name()"
<xsl:value-of select="./$KeyCol"/>
</xsl:if>
</xsl:attribute>
</input>Top
15 楼myy()回复于 2005-01-06 11:45:27 得分 0
谢谢zhmt((……>!)) ,你的还是有问题,if外面还要循环才行,不过还是很感谢你!
自己解决了 :-D
<input type="checkbox>
<xsl:attribute name="value">
<xsl:value-of select="./*[name()=$KeyCol]"/>
</xsl:attribute>
</input>
Top
16 楼zhmt(孜风)回复于 2005-01-06 11:46:45 得分 0
是啊,我也知道忘了,我想再回帖提醒你,但是系统提示我 不能连续3次以上回帖
还好你搞定了Top
17 楼zhmt(孜风)回复于 2005-01-06 11:48:07 得分 0
<input type="checkbox>
<xsl:attribute name="value">
<xsl:for-each select="*">
<xsl:if test="./$KeyCol=name()">
<xsl:value-of select="./$KeyCol"/>
</xsl:if>
</xsl:for-each>
</xsl:attribute>
</input>Top
18 楼zhmt(孜风)回复于 2005-01-06 11:56:41 得分 0
呵呵,你这个方法比我的简洁多了,学习Top




