1

不知道如何正确命名主题来指定我的问题 :) 我的 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"] &gt; 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"] &lt; 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>

任何帮助,将不胜感激 :)

4

5 回答 5

3

问题可能是您的 xsl:if 正在测试是否有任何ROW 行的价格大于 30,无论您当前的上下文是什么(即无论您当前位于哪个 ROW)。xpath 表达式开头的 / 表示您从文档节点开始搜索,而不是从当前节点开始。

假设您正在使用模板选择所有行,就像这样(或者您正在执行xsl:for-each

<xsl:apply-templates select="ROW">

然后,在与 ROW 匹配的模板中,您将编写xsl:if这样的代码

<xsl:if test='COLUMN[@NAME="price"] &gt; 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'] &gt; 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>
于 2013-01-03T19:53:21.727 回答
0

您的 XPath 表达式与您显示的 XML 不匹配。该data元素在 XML 中不可见(为了简单起见,我假设您省略了该元素),但该元素也不可见ROW。此外,您需要注意区分大小写 - 即您需要在 XPath 中使用columnname(小写)(反之亦然)。也一定有其他错误,因为给定的条件对于所有元素都是错误的。

于 2013-01-03T19:21:24.827 回答
0

我的朋友没有展示一切(让我们这样称呼它)。我们必须编写一个脚本来(我朋友之前说过)颜色价格高于 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"] &lt; "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>

这将为每个价格着色,但我们必须使用条件。

于 2013-01-03T19:55:30.213 回答
0

谢谢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"] &gt; 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"] &lt; 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>

于 2013-01-04T11:28:07.597 回答
0

回答 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>

test如果甚至有一个Row具有 child 的单个, attributr 中的条件总是满足COLUMN[@NAME="CENA_CENNIKOWA"]的,因为表达式是绝对的——它不依赖于模板匹配的当前节点。

指定条件的正确方法(我猜——由于没有提供 XML 文档)

<xsl:if test=
  '/dane/ceny/ROW[COLUMN[NAME="ID_PRODUKTU"]=current()/COLUMN[NAME="ID_PRODUKTU"] 
                and COLUMN[@NAME="CENA_CENNIKOWA"] > 30]'>
于 2013-01-04T03:35:39.183 回答