[英]Selecting from XML with XSL
不知道如何正确命名主题以指定我的问题:)我的XML数据库看起来像这样:
<data>
<prices>
<ROW>
<COLUMN NAME="product_id">00932932</COLUMN>
<COLUMN NAME="price">56</COLUMN>
... some other not irrelevant columns
</ROW>
... other rows with the same columns
</prices>
</data>
我正在尝试选择价格高于30且颜色为绿色的那些。 但它标志着所有的价格都是绿色的,好像这些条件对所有人来说都是正确的。 条件看起来像这样:
<xsl:if test='/data/prices/ROW[COLUMN[@NAME="price"] > 30]' >
<span style="color: green"><xsl:value-of select='/data/prices/ROW[COLUMN[@NAME="EXPIRATION_DATE"]="" and COLUMN[@NAME="PRODUCT_ID"]=current()/COLUMN[@NAME="PRODUCT_ID"] ]/COLUMN[@NAME="PRICE"]'/></span>
</xsl:if>
<xsl:if test='/data/prices/ROW[COLUMN[@NAME="PRICE"] < 30]' >
<xsl:value-of select='/data/prices/ROW[COLUMN[@NAME="EXPIRATION_DATE"]="" and COLUMN[@NAME="PRODUCT_ID"]=current()/COLUMN[@NAME="PRODUCT_ID"] ]/COLUMN[@NAME="PRICE"]'/>
</xsl:if>
任何帮助,将不胜感激 :)
问题可能是你的xsl:if测试是否有任何 ROW行的价格大于30,无论你当前的上下文是什么(即不管你当前所处的ROW如何)。 / xpath表达式的开头意味着您在文档节点处开始搜索,而不是当前节点。
假设您正在选择带有模板的所有行,就像这样(或者您正在使用xsl:for-each
<xsl:apply-templates select="ROW">
然后,在与ROW匹配的模板中,您将编写xsl代码:if if like
<xsl:if test='COLUMN[@NAME="price"] > 30'>
这是一个XSLT的小样本来演示
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/data/prices">
<table>
<xsl:apply-templates select="ROW" />
</table>
</xsl:template>
<xsl:template match="ROW">
<tr>
<xsl:if test="COLUMN[@NAME='price'] > 30">
<xsl:attribute name="style">background-color:green</xsl:attribute>
</xsl:if>
<td><xsl:value-of select="COLUMN[@NAME='product_id']" /></td>
<td><xsl:value-of select="COLUMN[@NAME='price']" /></td>
</tr>
</xsl:template>
</xsl:stylesheet>
您的XPath表达式与您显示的XML不匹配。 data
元素在XML中不可见(我假设您为简单起见省略了这一点),但ROW
元素也不是。 此外,您需要了解区分大小写 - 即您需要在XPath中使用column
和name
(小写)(反之亦然)。 也一定有其他错误,因为在给定的情况下,所有元素的条件都是错误的。
我的朋友没有展示一切(让我们这样说)。 我们必须写一个脚本(我的朋友之前说的)颜色价格高于30.此代码正在运行。 它显示了我们需要的一切:
<xsl:for-each select='/dane/produkty/ROW'>
<tr style="border-style: solid">
<td style="border-style: solid">
<xsl:value-of select='COLUMN[@NAME="ID_PRODUKTU"]'/>
</td>
<td style="border-style: solid">
<xsl:value-of select='COLUMN[@NAME="OPIS"]'/>
</td>
<td style="border-style: solid">
<xsl:if test='/dane/ceny/ROW[COLUMN[@NAME="CENA_CENNIKOWA"] ] ' >
<span style="color: green"><xsl:value-of select='/dane/ceny/ROW[COLUMN[@NAME="DATA_WYCOFANIA"]="" and COLUMN[@NAME="ID_PRODUKTU"]=current()/COLUMN[@NAME="ID_PRODUKTU"] ]/COLUMN[@NAME="CENA_CENNIKOWA"]'/></span>
</xsl:if>
<!--<xsl:if test='/dane/ceny/ROW[COLUMN[@NAME="CENA_CENNIKOWA"] < "31"]' >
<xsl:value-of select='/dane/ceny/ROW[COLUMN[@NAME="DATA_WYCOFANIA"]="" and COLUMN[@NAME="ID_PRODUKTU"]=current()/COLUMN[@NAME="ID_PRODUKTU"] ]/COLUMN[@NAME="CENA_CENNIKOWA"]'/>
</xsl:if>-->
</td>
</tr>
</xsl:for-each>
这将为每个价格着色,但我们必须使用条件。
回答matyo35的回复问题:
<xsl:if test='/dane/ceny/ROW[COLUMN[@NAME="CENA_CENNIKOWA"] ] ' > <span style="color: green"><xsl:value-of select='/dane/ceny/ROW[COLUMN[@NAME="DATA_WYCOFANIA"]="" and COLUMN[@NAME="ID_PRODUKTU"]=current()/COLUMN[@NAME="ID_PRODUKTU"] ] /COLUMN[@NAME="CENA_CENNIKOWA"]'/></span> </xsl:if>
如果甚至有一个具有子COLUMN[@NAME="CENA_CENNIKOWA"]
Row
, 则总是满足test
属性中的条件 ,因为表达式是绝对的 - 它不依赖于当前节点,与模板。
正确的方法(我猜 - 由于没有提供XML文档)指定条件 :
<xsl:if test=
'/dane/ceny/ROW[COLUMN[NAME="ID_PRODUKTU"]=current()/COLUMN[NAME="ID_PRODUKTU"]
and COLUMN[@NAME="CENA_CENNIKOWA"] > 30]'>
谢谢Dimitre,但它仍然是一样的。 所有价格都是绿色的。 我发布了整个代码。 我想那会更好:
<?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" doctype-public='-//W3C//DTD XHTML 1.0 Strict//EN'doctype-system='http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Zadanie 21</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<table style="border-style: solid">
<tr style="border-style: solid">
<td style="border-style: solid">ID</td>
<td style="border-style: solid">Produkt</td>
<td style="border-style: solid">Cena</td>
</tr>
<xsl:for-each select='/dane/produkty/ROW'>
<tr style="border-style: solid">
<td style="border-style: solid">
<xsl:value-of select='COLUMN[@NAME="ID_PRODUKTU"]'/>
</td>
<td style="border-style: solid">
<xsl:value-of select='COLUMN[@NAME="OPIS"]'/>
</td>
<td style="border-style: solid">
<xsl:if test='/dane/ceny/ROW[COLUMN[@NAME="CENA_CENNIKOWA"] > 30] ' >
<span style="color: green"><xsl:value-of select='/dane/ceny/ROW[COLUMN[@NAME="DATA_WYCOFANIA"]="" and COLUMN[@NAME="ID_PRODUKTU"]=current()/COLUMN[@NAME="ID_PRODUKTU"] ]/COLUMN[@NAME="CENA_CENNIKOWA"]'/></span>
</xsl:if>
<xsl:if test='/dane/ceny/ROW[COLUMN[@NAME="CENA_CENNIKOWA"] < 31]' >
<xsl:value-of select='/dane/ceny/ROW[COLUMN[@NAME="DATA_WYCOFANIA"]="" and COLUMN[@NAME="ID_PRODUKTU"]=current()/COLUMN[@NAME="ID_PRODUKTU"] ]/COLUMN[@NAME="CENA_CENNIKOWA"]'/>
</xsl:if>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.