我有使用mark属性的正确测试变量的问题

时间:2013-12-17 09:49:12

标签: xml xslt

您好我想测试变量,如果可能的话,我希望它具有属性。所以我有一个XML:

<tr class="alt-row">
<td class="column-country">American Samoa <span class="type">(Mobile)</span></td>
<td class="column-rate">0.500</td>
<td class="column-vat">0.575</td>
</tr>
<tr class="">
<td class="column-country">Andorra <span class="type">(Landline)</span> <span class="free">FREE*</span> <span class="superdeal">SuperDeal!**</span></td>
<td class="column-rate">FREE*</td>
<td class="column-vat">FREE*</td>
</tr>

当td class =“column-rate”为FREE *时,我需要输入数字0,否则为正常速率。如果它可能我想要它与属性/自由= 1,速率= 0.或自由= 0,速率= 0.500。或者以正常方式:D ...没有自由......所以如果列包含FREE *,则将数字0结束.END。

我试试这个:

<country>
  <xsl:variable name="country" select="normalize-space(xhtml:td[@class='column-country'])"/>

  <xsl:attribute name="name">
     <xsl:value-of select="normalize-space(substring-before($country, '('))"/>       
  </xsl:attribute>


  <rate>
    <xsl:variable name="type1" select="normalize-space(xhtml:td[@class = 'column-country']/xhtml:span)"/>
    <xsl:variable name="type" select="translate($type1, '()', '') "/>
    <xsl:variable name="price" select="normalize-space(translate(xhtml:td[@class = 'column-rate'], 'abcdefghijklmnopqrstuvwzyxABCDEFGHIJKLMNOPQRSTUVVWXYZ()*¢$€', '')) "/>
    <xsl:variable name="cena">
      <xsl:choose>
        <xsl:when test="$price != ''">
          <xsl:value-of select="$price"/>
          <xsl:apply-templates select="."/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$VAT"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:variable name="cena1" select="normalize-space(substring-before($cena, '(')) "/>
    <xsl:variable name="cena2" select="normalize-space(translate(xhtml:td[@class = 'column-rate'], 'abcdefghijklmnopqrstuvwzyxABCDEFGHIJKLMNOPQRSTUVVWXYZ()*¢$€', '')) "/>


    <xsl:attribute name="type">
      <xsl:value-of select="$type"/>       
    </xsl:attribute>
    <xsl:attribute name="operator">
    </xsl:attribute>

    <xsl:attribute name="currency">
      <xsl:value-of select="$Currency"/>
    </xsl:attribute>
    <xsl:attribute name="vat">
      <xsl:value-of select="$VAT"/>
    </xsl:attribute>
    <xsl:attribute name="unit">
      <xsl:value-of select="$UNIT"/>
    </xsl:attribute>
    <xsl:value-of select="$cena2"/>
  </rate>    
</country>

我的输出是:

   <country name="American Samoa">
      <rate type="Mobile" operator="" currency="EUR" vat="0" unit="minute">0.500</rate>
   </country>
   <country name="Andorra">
      <rate type="Landline" operator="" currency="EUR" vat="0" unit="minute"/>
   </country>

但我需要:

   <country name="American Samoa">
      <rate type="Mobile" operator="" currency="EUR" vat="0" unit="minute">0.500</rate>
   </country>
   <country name="Andorra">
      <rate type="Landline" operator="" currency="EUR" vat="0" unit="minute"/>0</rate>
   </country>

   <country name="American Samoa">
      <rate type="Mobile" operator="" currency="EUR" vat="0" unit="minute">0.500</rate>
   </country>
   <country name="Andorra">
      <rate type="Landline" operator="" currency="EUR" vat="0" unit="minute" free="1"/>0</rate>
   </country>

但是它不能正常工作,因为当它自由时,速率是空的。

2 个答案:

答案 0 :(得分:1)

怎么样:

...
<xsl:variable name="cena">
    <xsl:choose>
        <xsl:when test="number($price)">
            <xsl:value-of select="$price"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="0"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>
...

答案 1 :(得分:0)

您的XSLT中存在一个明确的和一个可能的错误。通过将变量price与空字符串进行比较会导致明确的错误。由于变量是从translate函数调用派生的,因此它实际上包含五个空格(来自FREE*),因为translate仅将源字符串中的每个字符替换为目标中的相应字符字符串,如果目标字符串太短,则空格为默认值。所以,我建议您将测试更改为

<xsl:when test="normalize-space($price) != ''">

然而,这样做了,你可以通过调用<xsl:apply-templates>来合理地(取决于上下文)遇到另一个错误。你需要这个什么?我建议您删除它。