【问题标题】:XSL:if test not working as expectedXSL:如果测试没有按预期工作
【发布时间】:2014-11-22 14:52:15
【问题描述】:
   <xsl:for-each select="class/student">
         ID:   <xsl:value-of select="id"/><br/>
           Name:  <xsl:value-of select="lastName"/>,<xsl:value-of select="firstName"/><br/>
          Date:  <xsl:value-of select="date"/><br/>
           Major: <xsl:if test="major[@Year > 2008]"> 
                    <xsl:value-of select="major"/> ,
                     declared in:  <xsl:value-of select="major[@Year]"/>    
                  </xsl:if><br/><br/>
          </xsl:for-each>

XML 代码:

     <student>
    <id>1000001</id>
    <lastName>john</lastName>
    <firstName>Doe</firstName>
    <date format="d">08/25/2006</date>
    <major Year="2006">CS:BS</major>
  </student>

输出:

编号:1000001 姓名:多伊,约翰 注册日期:2006 年 8 月 25 日 专业:CS:BS,申报于:CS:BS

上面的 xml 代码只是实际 xml 代码的一个示例,还有更多的 'Year' 值/元素。

大家好,

我试图只获得年份大于 2008 年的专业,但由于某种原因我得到了错误的输出。

谢谢

【问题讨论】:

  • 为了能够提供帮助,我们确实需要查看更多的输入 XML,以及足够的 XSLT 来重现问题(而不仅仅是一些被注释掉的 XSLT)。显示您的预期和实际输出也会有所帮助,因为说您“得到错误的输出”有点含糊。谢谢!
  • 刚刚添加了更多,谢谢!
  • 这样更好......虽然您的 XSLT 引用了您的 class 元素,但您的 XML 中没有显示该元素。另外,输出显示的是您现在获得的实际输出,还是您的预期输出?
  • 我现在得到的实际输出,类只是xml文件的父节点。

标签: html xml xslt xhtml


【解决方案1】:

您说“'Year' 值/元素比显示的要多”,这可能是问题的关键。如果您的输入包含两个元素

<major Year="2006">CS:BS</major>
<major Year="2009">CS:BS</major>

然后test="major/@Year &gt; 2008" 将返回 true,因为有一个这样的元素,并且在 XSLT 1.0 中,&lt;xsl:value-of select="major"/&gt; 将输出第一个选定的元素(在 2.0 中它会引发错误)。

以后,请尝试提供完整的示例样式表和源文档,以便其他人重现该问题。如果您尝试在不测试缩减版本是否存在问题的情况下对其进行缩减,则很容易消除导致问题的实际根源。

【讨论】:

    【解决方案2】:

    问题是你正在倒退。你需要选择你想要的东西,然后使用它。您正在检查您想要的东西是否存在,然后使用不太具体的东西。

    这应该可以解决您的问题:

    Major: 
    <xsl:for-each select="major[@Year > 2008]">
      <br/>
      <xsl:value-of select="."/>, declared in: <xsl:value-of select="@Year"/>
    </xsl:for-each>
    <br/>
    

    你的使用

    <xsl:value-of select="major[@Year]"/>
    

    也是不正确的。以下内容实际上会输出年份值:

    <xsl:value-of select="major/@Year"/>
    

    我强烈建议您对静态文本使用&lt;xsl:text&gt;&lt;xsl:value-of&gt;。您当前在整个 XSLT 中散布文本的方法导致 XSLT 代码看起来非常混乱:

    <xsl:for-each select="class/student">
      <xsl:value-of select="concat('ID: ', id)"/>
      <br/>
      <xsl:value-of select="concat('Name: ', lastName, ',', firstName)"/>
      <br/>
      <xsl:value-of select="concat('Date: ', date)"/>
      <br/>
      <xsl:text>Major:</xsl:text>
      <xsl:for-each select="major[@Year > 2008]">
        <br/>
        <xsl:value-of select="concat(., ', declared in: ', @Year)"/>
      </xsl:for-each>
      <br/>
    </xsl:for-each>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 2015-08-02
      • 2012-04-12
      • 2017-07-17
      • 2013-04-12
      相关资源
      最近更新 更多