Html XSL中的变量
我对XSL有点陌生,我遇到了一些问题。根据我的研究,XSL变量Html XSL中的变量,html,xml,xslt,Html,Xml,Xslt,我对XSL有点陌生,我遇到了一些问题。根据我的研究,XSL变量如果在顶级声明,则为全局变量;如果在模板中声明,则为局部变量,并且不能更改值。那么,这是否意味着无法声明一个全局变量,然后在模板内更改其值 我在迭代一个结果集时遇到了以下情况,我得到了如下结果: <xsl:for-each select="NewDataSet/Table1"> <xsl:if test="position()= 1"> <xsl:value-of select="SchoolNam
如果在顶级声明,则为全局变量;如果在模板中声明,则为局部变量,并且不能更改值。那么,这是否意味着无法声明一个全局变量,然后在模板内更改其值
我在迭代一个结果集时遇到了以下情况,我得到了如下结果:
<xsl:for-each select="NewDataSet/Table1">
<xsl:if test="position()= 1">
<xsl:value-of select="SchoolName"/>
</xsl:if>
<xsl:if test="position()= 2">
<xsl:value-of select="gender"/>
</xsl:if>
<xsl:if test="position() = last()">
<div onclick="showTallyBySchool(,'{SchoolName}','{gender}')">
<xsl:value-of select="node()"/>
</div>
</xsl:if>
</xsl:for-each>
如您所见,在迭代过程中,我需要第三个“if”中的“gender”和“schoolname”的值。如果无法存储它们,我将如何访问它们
编辑:修复了一些拼写错误,如果有帮助,下面是XML的摘录:
<NewDataSet>
<Table1>
<SchoolName>Unknown School</SchoolName>
<Gender>Male</Gender>
<PS>0</PS>
<PK>0</PK>
<K>0</K>
</Table1>
</NewDataSet>
无名学校
男性
0
0
0
您可以相对于当前节点访问它们
我认为您对XML的结构感到困惑。例如,您正在从除第一个表1
之外的所有表中选择SchoolName
。但是代码是这样的
<xsl:for-each select="NewDataSet/Table1[last()]">
<xsl:variable name="school_name" select="../Table1[1]/SchoolName"/>
<xsl:variable name="gender" select="../Table1[2]/gender"/>
<div onclick="showTallyBySchool(,'{$school_name}',{$gender})">
<xsl:value-of select="node()"/>
</div>
</xsl:for-each>
请显示您的目标XML数据。我相信有一个更好的解决方案。首先,XSL中的“变量”在赋值后不能更改,这一点是正确的。它只是与转换执行相关的“变量”(即,对于不同的输入,它可以得到不同的值),但在转换中它不是“变量”
其次,从您的示例来看,您仍然在考虑命令式代码。您没有给出足够的详细信息来确切说明,但听起来您有一个SQL类型表的XML文档,其中
SchoolName is in column 1
Gender is in column 2
您似乎在表1
元素本身中有数据,而不是在该表中的行
元素中
写这篇文章的一种更为惯用的方式是
<!-- tells what to do at the top level -->
<xsl:template match="/NewDataSet">
<!-- This means, process child elements according to the templates I define -->
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="Table1">
<!-- You should use the exact element names if they are known, couldn't tell from example -->
<xsl:variable name="SchoolName" select="*[1]"/>
<xsl:variable name="Gender" select="*[2]"/>
<div onclick="showTallyBySchool(,'{$SchoolName}',{$Gender})">
<!-- it's not clear what you want here, but it's probably not this -->
<xsl:value-of select="node()"/>
</div>
</xsl:template>
XSL变量如果在顶级声明,则为全局变量;如果在模板中声明,则为局部变量
不,XSL变量的作用域非常严格地限定为包含它的XSLT元素。如果在
中声明它,则在相应的
之后它将不可用
并且不能更改该值
没错,所有XSLT变量都是不可变的
那么,这是否意味着无法声明一个全局变量,然后在模板内更改其值
正确,你永远不需要这样做。一般来说:如果您发现自己试图更改XSLT中的变量值,那么您解决问题的方法是错误的
如您所见,在迭代过程中,我需要第三个“if”中的“gender”和“schoolname”的值。如果无法存储它们,我将如何访问它们
使用您的XML
<NewDataSet>
<Table1>
<SchoolName>Unknown School</SchoolName>
<Gender>Male</Gender>
<PS>0</PS>
<PK>0</PK>
<K>0</K>
</Table1>
</NewDataSet>
无名学校
男性
0
0
0
…解决方案非常简单。您根本不需要任何变量。只需直接访问XML节点
和
:
<xsl:template match="NewDataSet">
<xsl:apply-templates select="Table1" />
</xsl:template>
<xsl:template match="Table1">
<div>
<xsl:value-of select="SchoolName" />
</div>
<div>
<xsl:value-of select="Gender" />
</div>
<div onclick="showTallyBySchool('{SchoolName}', {Gender})">
<xsl:text>Show Tally</xsl:text>
</div>
</xsl:template>
显示计数
虽然通常我建议不要混合使用HMTL和JavaScript,尤其不要使用XSLT生成JavaScript。这只会变得丑陋
想象一个
包含一个引号。使用上述设置,您已经破坏了事件处理程序
另外,使用像onclick
这样的内联事件处理程序违反了关注点分离的原则(本例中为标记和页面逻辑),会生成难看的HTML,这意味着在本例中,当您确实想要修复JavaScript中的错误时,需要更改XSLT文件。它可能还有其他影响,比如与现代JS框架的不兼容(甚至内存泄漏,尽管现在这种情况不太常见)——简言之,它通常是不受欢迎的。最好将所有JavaScript保存在一个单独的文件中。请包含相应的XML片段和所需的输出。不建议使用空模板覆盖默认规则。我认为那是在射自己的脚。啊!所以没有SchoolName
和gender
元素?我想你是对的。让我们拭目以待,看看OP是否想告诉我们@托马拉克,根据你的建议,我删除了那个部分,因为它不会有任何区别。在很多情况下,我不确定输入格式是否会改变(并且只想明确地选择我要求的内容),我更喜欢这种用法。我可能是从诺瓦切夫先生那里学来的,他通常会在回答中提到这一点。但由于您也是XSL专家,我将不得不重新考虑。我通常从
开始,并在任何后续
中使用显式select表达式,因此我从不确定我正在处理哪些元素。但仔细想想,
从另一端解决了同样的问题。