在xsl文件中获取错误

时间:2017-01-06 09:17:02

标签: xml xslt

我的xsl文件如下:

 <SELECT>
  <xsl:attribute name="name">Team</xsl:attribute>
  <xsl:attribute name="size">1</xsl:attribute>
  <xsl:attribute name="onchange">selTeam_onclick()</xsl:attribute>
  <xsl:if test='.[z:row]'>
    <xsl:for-each select="z:row">
      <OPTION>
        <xsl:attribute name="value">
          <xsl:value-of select="@TEAM_ID"/>
        </xsl:attribute>
        <xsl:if match='.[@TEAM_ID=@DEFAULTID]'>
          <xsl:attribute name="selected"/>
        </xsl:if>
        <xsl:value-of select="@TEAM_NAME"/>
      </OPTION>
    </xsl:for-each>
  </xsl:if>
  <xsl:if test='.[$not$ z:row]'>
    <OPTION>
      <xsl:attribute name="value">-1</xsl:attribute>
      No Teams
    </OPTION>
  </xsl:if>
</SELECT>

对于xml文件

<z:row TEAM_ID="1" TEAM_NAME="John" TEAM_LIST_TYPE="PUBLIC" TEAM_EDITABLE="Y" TEAM_OWNER="234"/>
<z:row TEAM_ID="2" TEAM_NAME="Maria" TEAM_LIST_TYPE="PUBLIC" TEAM_EDITABLE="Y" TEAM_OWNER="545"/>
<z:row TEAM_ID="3" TEAM_NAME="Dick" TEAM_LIST_TYPE="PUBLIC" TEAM_EDITABLE="N" TEAM_OWNER="766"/>

当我尝试通过上面的xsl文件生成html时,得到xpath表达式的错误。

2 个答案:

答案 0 :(得分:1)

  1. 说“请帮助我这是紧急的”往往会阻止人们做出回应,因为他们认为你处于恐慌模式,并且不会仔细阅读和应用答案。

  2. 告诉我们你得到一个错误,但没有告诉我们错误是什么,显然是不友好的。你是否希望我们在被蒙住眼睛时帮助你?

  3. 正如Martin指出的那样,您的补充信息显示您使用的是旧的Microsoft WD-xsl语言,该语言是在1998年IE4中引入的,在XSLT 1.0最终确定之前几个月。这种语言已经过时了近20年,只能在非常有限的环境中使用;此外,微软已设法从网上删除所有痕迹,因此很难找到规范。

  4. 我能给你的唯一明智的建议是从WD-xsl向前推进到某个版本的XSLT,最好是现代版本。可悲的是,因为你处于恐慌模式,截止日期临近,我担心这些建议不会受到欢迎。

答案 1 :(得分:1)

要修复您显示的XSLT代码段,要使用的正确代码如下:

    <SELECT>
      <xsl:attribute name="name">Team</xsl:attribute>
      <xsl:attribute name="size">1</xsl:attribute>
      <xsl:attribute name="onchange">selTeam_onclick()</xsl:attribute>
      <xsl:if test='z:row'>
        <xsl:for-each select="z:row">
          <OPTION>
            <xsl:attribute name="value">
              <xsl:value-of select="@TEAM_ID"/>
            </xsl:attribute>
            <xsl:if test='@TEAM_ID=@DEFAULTID'>
              <xsl:attribute name="selected"/>
            </xsl:if>
            <xsl:value-of select="@TEAM_NAME"/>
          </OPTION>
        </xsl:for-each>
      </xsl:if>
      <xsl:if test='not(z:row)'>
        <OPTION>
          <xsl:attribute name="value">-1</xsl:attribute>
          No Teams
        </OPTION>
      </xsl:if>
    </SELECT>

两个主要变化是

  • <xsl:if match=...替换为<xsl:if test=...
  • $not$替换为not()函数

如前所述,您还需要将名称空间声明更改为http://www.w3.org/1999/XSL/Transform,并删除&#34;语言&#34;属性。例如(更新名称空间URI以匹配您的实际名称)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:rs="rs" 
    xmlns:z="z" 
    exclude-result-prefixes="rs z">

http://xsltransform.net/ncntCSz

中查看此操作

您的评论显示您在xsl:stylesheet元素上显示language="JavaScript"这一事实表明您的实际XSLT也可能使用<xsl:script><xsl:eval>,我依旧记得支持它。如果是这样,那么重构XSLT将是一项更大的任务。

如果您需要询问有关XSLT其他部分的其他问题,请遵循Michael Kay在答案中给您的建议。