与XSLT进行区别设置感知的数字比较

时间:2010-09-30 09:55:48

标签: xslt comparison numbers locale

我在XML中有很多成本,我试图与另一个成本值进行比较,以确定要显示的值(仅比比较器高一些)。当数字使用小数点作为分隔符但不使用逗号作为小数分隔符的数字时,这种方法有效。我可能会得到,取决于当地。

这就是我所拥有的:

<patron_max_cost><![CDATA[1,00]]></patron_max_cost>
<service_costs>
  <location_cost>
    <location_desc><![CDATA[location1]]></location_desc>
    <cost_to_user><![CDATA[0,99]]></cost_to_user>
  </location_cost>
  <location_cost>
      <location_desc><![CDATA[location2]]></location_desc>
      <cost_to_user><![CDATA[1,50]]></cost_to_user>
  </location_cost>
</service_costs>

<xsl:variable name="filtered_location_costs">
  <xsl:for-each select="service_costs/location_cost">
      <xsl:if test="number(cost_to_user) &gt; number(patron_max_cost)">
        <xsl:copy-of select="." />
      </xsl:if>
  </xsl:for-each>
</xsl:variable>

此操作失败,因为cost_to_user和patron_max_cost NaN 。有没有办法进行这种比较,这将适用于两种输入样式,并不涉及像比较之前将逗号转换为小数点这样的东西?我正在使用XSLT2.0和Saxon8。

2 个答案:

答案 0 :(得分:0)

我会使用从逗号到小数的转换,但也会保留一个变量,说明第一个位置是否有逗号,以便我可以正确显示它(即将其转换回来。

答案 1 :(得分:0)

<强>予。 XSLT 1.0解决方案:

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match=
  "location_cost[not(translate(cost_to_user, ',', '.')
                     >
                     translate(/*/patron_max_cost, ',', '.')
                     )
                 ]
  "/>

</xsl:stylesheet>

应用于提供的XML文档

<t>
    <patron_max_cost><![CDATA[1,00]]></patron_max_cost>
    <service_costs>
        <location_cost>
            <location_desc><![CDATA[location1]]></location_desc>
            <cost_to_user><![CDATA[0,99]]></cost_to_user>
        </location_cost>
        <location_cost>
            <location_desc><![CDATA[location2]]></location_desc>
            <cost_to_user><![CDATA[1,50]]></cost_to_user>
        </location_cost>
    </service_costs>
</t>

产生想要的结果

<t>
   <patron_max_cost>1,00</patron_max_cost>
   <service_costs>
      <location_cost>
         <location_desc>location2</location_desc>
         <cost_to_user>1,50</cost_to_user>
      </location_cost>
   </service_costs>
</t>

<强> II。 XSLT 2.0解决方案:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 >
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vpatron_max_cost" as="xs:decimal"
  select="xs:decimal(translate(/*/patron_max_cost, ',', '.'))"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match=
  "location_cost[xs:decimal(translate(cost_to_user, ',', '.'))
                le
                 $vpatron_max_cost
                 ]
  "/>

</xsl:stylesheet>