2012-10-19 47 views
0

我有一个包含序列化数据注释的对象。它有这么100%肯定一个布尔值属性,它是真实的(与调试器进行测试),但是当我有这样的XSLT:XSLT 1.0 xsl:布尔选择测试

<xsl:for-each select="order/Coupons/orderedCoupons" > 
    <tr> 
     <td>Discount <xsl:value-of select="@code"/></td> 
     <td> 
      <xsl:choose> 
       <xsl:when test="@isperc='true'"> 
        <xsl:value-of select="@disvalue"/>% 
       </xsl:when> 
       <xsl:otherwise>Epic fail 
        &#8364; <xsl:value-of select="format-number(@disvalue, '#.###,00', 'euro')" /> 
       </xsl:otherwise> 
      </xsl:choose> 
     </td> 
    </tr> 
</xsl:for-each> 

它始终显示史诗失败,因此测试总是失败。我也试过:

  • @ isperc = '真'
  • @ isperc = 1个
  • 布尔(@isperc)
  • @isperc =真()

一些背景info:它是一个asp.net对象,我使用数据注释进行序列化。 .Net中的XSLT支持仅为1.0。

编辑一块我coupon.cs

[XmlAttribute("isperc")] 
public bool IsPerc 
{ 
    get { return _isPerc; } 
} 

它不是空的,但作为第二评注者指出,什么是<xsl:value-of select="@isperc"/>价值很好,似乎空。它解析为html中的任何内容。没有一个空格,不为空等等。这是奇怪,因为布尔是true ...

EDIT2这也没什么<xsl:value-of select="string(@isperc)"/>输出,所以这也失败<xsl:when test="string(@isperc) = 'true'">

+2

你能举例说明你正在尝试处理的输入XML吗? –

+1

您是否消除了个案问题?请参阅http://stackoverflow.com/questions/8940695/how-to-check-for-string-equality-case-insensitive-in-xsl。什么''return? – dash

+0

您*必须*提供源XML文档(请尽可能小)和完整的XSLT转换 - 不仅是一个片段。然后任何人都可以重现这个问题,这里的许多人可以提供一个很好的解决方案。因此,在调试器中,获取序列化结果并将此XML文档放置在问题中。看起来,这是一个C#序列化问题,而不是XSLT问题。 –

回答

2
<xsl:when test="@IsPerc = true()"> 

应与C#的布尔类型。

我见过的解决方法是将布尔值转换为数字,但;

<xsl:when test="number(@IsPerc) > 0"> 
+0

我会尝试,但'XmlAttribute'是小写。 'code'也是小写字母和C#属性'Code'。但我会试一试,并会更新你a.s.a.p.感谢您的回答 –