在 xsl 中如何在select中使用变量?

myy 2005-01-06 09:51:17
比如:
---------------------------------------------------
<?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>
...全文
431 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhmt 2005-01-06
  • 打赏
  • 举报
回复
呵呵,你这个方法比我的简洁多了,学习
zhmt 2005-01-06
  • 打赏
  • 举报
回复
<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>
zhmt 2005-01-06
  • 打赏
  • 举报
回复
是啊,我也知道忘了,我想再回帖提醒你,但是系统提示我 不能连续3次以上回帖
还好你搞定了
myy 2005-01-06
  • 打赏
  • 举报
回复
谢谢zhmt((……>!)) ,你的还是有问题,if外面还要循环才行,不过还是很感谢你!



自己解决了 :-D

<input type="checkbox>
<xsl:attribute name="value">
<xsl:value-of select="./*[name()=$KeyCol]"/>
</xsl:attribute>
</input>


zhmt 2005-01-06
  • 打赏
  • 举报
回复
基本就是下面这样,你调试一下
<input type="checkbox>
<xsl:attribute name="value">
<xsl:if test="./$KeyCol=name()"
<xsl:value-of select="./$KeyCol"/>
</xsl:if>
</xsl:attribute>
</input>
zhmt 2005-01-06
  • 打赏
  • 举报
回复
呵呵,按你现在的XML,你可以遍历R下的所有结点
看看结点名字(name()用获得)是否等于KeyCol,相等的话,输出该结点的值 就可以了
zhmt 2005-01-06
  • 打赏
  • 举报
回复
也可以这样,
<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>
myy 2005-01-06
  • 打赏
  • 举报
回复
为了减小xml的大小,把C1,C2...的相信息集中放在<C></C>中,
其实,每个"字段"的相关信息比较多的,不光key,还有显示名,类型,精度...等,
在记录中会无意义的重复很多次。
zhmt 2005-01-06
  • 打赏
  • 举报
回复
我觉得这样更好一点:
<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的)结点值
myy 2005-01-06
  • 打赏
  • 举报
回复
这样不太好吧?我的C1,C2...个数并不是固定的呀。
zhmt 2005-01-06
  • 打赏
  • 举报
回复
我知道了
这样把:输出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>
myy 2005-01-06
  • 打赏
  • 举报
回复
直接用<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'
zhmt 2005-01-06
  • 打赏
  • 举报
回复
$KeyCol中存放的为C1所以输出出来也就是C1,
换成这样:
判断$KeyCol存放的是否为C1,是,就输出C1结点的值;不是,你自己处理
myy 2005-01-06
  • 打赏
  • 举报
回复
谢谢楼上关注。

>>我感觉把谁是key放到xml中来处理更好啊

为了减小xml的大小,把C1,C2的相信息集中放在<C></C>中,
<C>...</C>可以看作“"字段”的描述信息。
下面的<R>...</R>其实就是一个个的“记录”。
zhmt 2005-01-06
  • 打赏
  • 举报
回复
<xsl:value-of select="./$KeyCol"/>
为什么不直接用<xsl:value-of select="//T/C/@key"/>呢?
zhmt 2005-01-06
  • 打赏
  • 举报
回复
我感觉把谁是key放到xml中来处理更好啊
zhmt 2005-01-06
  • 打赏
  • 举报
回复
可以直接用js去修改要使用变量的结点的属性值的
给你的包含xsl代码的xml结点一个id属性xslId
然后可以直接这样:
var node = xslId.selectSingleNode("//td/input/xsl:attribute/");
node.text = "像要赋的值";
myy 2005-01-06
  • 打赏
  • 举报
回复
xsl:value-of select="$KeyCol"/> 这样也不对,得到的checkbox的value直接为'C1'

8,906

社区成员

发帖
与我相关
我的任务
社区描述
XML/XSL相关问题讨论专区
社区管理员
  • XML/XSL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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