想要将价格转换为表达价格范围,以便我可以说,例如,“低于20美元”而不是17.95美元。使用xml:choose对我有用,但是当我尝试将结果放入类属性时,我收到一个错误:
XSLT转换期间出错:发生了未知错误()
我一直在阅读xsl:variable但在这种情况下似乎无法找到设置变量的正确方法。
XML
<?xml version="1.0" encoding="UTF-8"?>
<productSearchResponse>
<status>SUCCESS</status>
<products found="20">
<product>
<itemNumber>50575</itemNumber>
<itemName>Example 1</itemName>
<price>$ 17.95</price>
</product>
...
<product>
<itemNumber>81588</itemNumber>
<itemName>Example 2</itemName>
<price>$ 25.95</price>
</product>
</products>
</productSearchResponse>
样式表
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<head>
</head>
<body>
<xsl:for-each select="/essentials/webservice">
<xsl:for-each select="document(@filename)/productSearchResponse/products/product">
<xsl:variable name="producingCountry" select="producingCountry"/>
<xsl:variable name="price" select="price"/>
<xsl:variable name="priceNoSymbol" select="translate($price,'$', '')"/>
<!-- Assign pricing bands -->
<xsl:choose>
<xsl:when test="$priceNoSymbol < '20'">
<xsl:variable name="priceBand" select="'under20'" />
</xsl:when>
<xsl:when test="$priceNoSymbol > '39.99'">
<xsl:variable name="priceBand" select="'20to40'" />
</xsl:when>
<xsl:otherwise>
<xsl:variable name="priceBand" select="'over40'" />
</xsl:otherwise>
</xsl:choose>
<!-- Make the product div -->
<div class="product {$producingCountry} {$price} {$priceNoSymbol} ">
<!-- How do I insert priceBand into the class attribute? ^ -->
<xsl:apply-templates select="itemName"/><br/>
<xsl:apply-templates select="producingCountry"/><br/>
<xsl:apply-templates select="price"/><br/><br/>
</div>
</xsl:for-each>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
生成的html
<html>
<head>
<body>
<div class="product France $ 17.95 17.95 ">
Example 1
<br>
France
<br>
$ 17.95
<br>
<br>
</div>
...
<div class="product Portugal $ 25.95 25.95 ">
Example 2
<br>
Portugal
<br>
$ 25.95
<br>
<br>
</div>
</body>
</html>
所需的HTML
<html>
<head>
<body>
<div class="product France $ 17.95 17.95 under20 ">
Example 1
<br>
France
<br>
$ 17.95
<br>
<br>
</div>
...
<div class="product Portugal $ 25.95 25.95 20to40">
Example 2
<br>
Portugal
<br>
$ 25.95
<br>
<br>
</div>
</body>
</html>
答案 0 :(得分:5)
我没有详细研究过整个问题,但你应该替换
<xsl:choose>
<xsl:when test="$priceNoSymbol < '20'">
<xsl:variable name="priceBand" select="'under20'" />
</xsl:when>
<xsl:when test="$priceNoSymbol > '39.99'">
<xsl:variable name="priceBand" select="'20to40'" />
</xsl:when>
<xsl:otherwise>
<xsl:variable name="priceBand" select="'over40'" />
</xsl:otherwise>
</xsl:choose>
与
<xsl:variable name="priceband">
<xsl:choose>
<xsl:when test="$priceNoSymbol < 20">under20</xsl:when>
<xsl:when test="$priceNoSymbol < 40">20to40</xsl:when>
<xsl:otherwise>over40</xsl:otherwise>
</xsl:choose>
</xsl:variable>
和
<xsl:variable name="priceNoSymbol" select="translate($price,'$', '')"/>
与
<xsl:variable name="priceNoSymbol" select="number(translate($price,'$', ''))"/>
当您在xsl:when
元素中定义变量时,它几乎立即超出范围,并且在xsl:choose
之外不可用。
答案 1 :(得分:1)
在$priceNoSymbol
上使用number()
并与20.00
进行比较,而不是'20.00'
。你可能在这里进行字符串比较,这似乎不是你想要的。您可能还需要在$priceBand
之外定义xsl:when
。
答案 2 :(得分:1)
<xsl:choose> <xsl:when test="$priceNoSymbol < '20'"> <xsl:variable name="priceBand" select="'under20'" /> </xsl:when> <xsl:when test="$priceNoSymbol > '39.99'"> <xsl:variable name="priceBand" select="'20to40'" /> </xsl:when> <xsl:otherwise> <xsl:variable name="priceBand" select="'over40'" /> </xsl:otherwise> </xsl:choose>
原因是这样定义的三个变量名为priceBand
,立即输出范围,稍后引用这样的变量时,resut是“变量未定义”错误。
使用强>:
<xsl:variable name="priceBand">
<xsl:choose>
<xsl:when test=
"$priceNoSymbol < 20">under20</xsl:when>
<xsl:when test=
"$priceNoSymbol > 39.99">20to40</xsl:when>
<xsl:otherwise>over40</xsl:otherwise>
</xsl:choose>
</xsl:variable>