Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html XSL中的变量_Html_Xml_Xslt - Fatal编程技术网

Html 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有点陌生,我遇到了一些问题。根据我的研究,XSL变量
如果在顶级声明,则为全局变量;如果在模板中声明,则为局部变量,并且不能更改值。那么,这是否意味着无法声明一个全局变量,然后在模板内更改其值

我在迭代一个结果集时遇到了以下情况,我得到了如下结果:

<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表达式,因此我从不确定我正在处理哪些元素。但仔细想想,
从另一端解决了同样的问题。