如何使用XSLT显示XML的确切值?

时间:2018-03-18 19:30:43

标签: xml xslt

这是我第一次使用XSLT和XML。 所以我要问的是,我如何只显示具有相同product_type的特定产品,如“主板”,“粉丝”等? 也许像product_type == "fan"这样的东西,我不确定。 我的计划是为每个product_type创建一个不同的XSLT。

目前,我只能显示XML中的每个产品。 XML文件看起来像这样

<?xml version="1.0" standalone="yes"?>
    <products>
      <product>
        <Id>7</Id>
        <product_name>Test</product_name>
        <product_price>123</product_price>
        <product_type>MOTHER BOARD</product_type>
        <product_description>123123</product_description>
        <product_image>gpu_white.png</product_image>
      </product>
      <product>
        <Id>14</Id>
        <product_name>wwww</product_name>
        <product_price>1321</product_price>
        <product_type>FAN</product_type>
        <product_description>qwewqeqw</product_description>
        <product_image>hd_white.png</product_image>
      </product>
    <product>
        <Id>22</Id>
        <product_name>321123</product_name>
        <product_price>321</product_price>
        <product_type>MEMORY</product_type>
        <product_description>Lorem ipsum dolor sit amet</product_description>
        <product_image>fan_white.png</product_image>
      </product>
    </products>

和XSLT

<?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
        <xsl:output method="xml" indent="yes"/>

        <xsl:template match="/">
        <div class="main">
          <xsl:for-each select="products/product">
            <div class="box">
              <h3 style="color:white">
                <xsl:value-of select="product_name"/>
              </h3>
              <xsl:element name="img">
                <xsl:attribute name="src">
                  product_image/<xsl:value-of select="product_image"/>
                </xsl:attribute>
                <xsl:attribute name="width">
                  100px
                </xsl:attribute>
                <xsl:attribute name="height">
                  100px
                </xsl:attribute>
              </xsl:element>
              <p style="color:white">
                RM  <xsl:value-of select="format-number(product_price,'0.00')" />
              </p>
              <p style="font-size:9pt;">
                <xsl:value-of select="product_description"/>
              </p>
              <xsl:element name="button">
                <xsl:attribute name="class">btn btn-danger my-cart-btn</xsl:attribute>
                <xsl:attribute name="data-id">
                  <xsl:value-of select="Id"/>
                </xsl:attribute>
                <xsl:attribute name="data-name">
                  <xsl:value-of select="product_name"/>
                </xsl:attribute>
                <xsl:attribute name="data-summary">
                  <xsl:value-of select="product_description"/>
                </xsl:attribute>
                <xsl:attribute name="data-price">
                  <xsl:value-of select="product_price"/>
                </xsl:attribute>
                <xsl:attribute name="data-quantity">1</xsl:attribute>
                <xsl:attribute name="data-image">
                  product_image/<xsl:value-of select="product_image"/>
                </xsl:attribute>
                Add to Cart <span class="glyphicon glyphicon-shopping-cart"></span>
              </xsl:element>

            </div>
          </xsl:for-each>
        </div>
      </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:2)

这样做非常简单。只需将条件添加到方括号中的select表达式中,即可表示条件

<xsl:for-each select="products/product[product_type = 'FAN']">

(请记住它区分大小写)

更好的是,使用参数,而不是每个产品类型都有一个单独的样式表...

<xsl:param name="prodType" select="'FAN'"/>

<xsl:template match="/">
<div class="main">
  <xsl:for-each select="products/product[product_type = $prodType]">

如何将参数传递给XSLT取决于您使用的XSLT处理器以及用于调用它的平台。

请注意,您可以通过删除xsl:elementxsl:attribute标记来简化XSLT,并直接写出元素和属性,利用属性值模板,您可以在其中获取值属性基于表达式的值。

试试这个XSLT ....

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="html" indent="yes"/>

    <xsl:param name="prodType" select="'FAN'"/>

    <xsl:template match="/">
    <div class="main">
      <xsl:for-each select="products/product[product_type = $prodType]">
        <div class="box">
          <h3 style="color:white">
            <xsl:value-of select="product_name"/>
          </h3>
          <img src="product_image/{product_image}" width="100px" height="100px"></img>
          <p style="color:white">
            RM  <xsl:value-of select="format-number(product_price,'0.00')" />
          </p>
          <p style="font-size:9pt;">
            <xsl:value-of select="product_description"/>
          </p>
          <button class="btn btn-danger my-cart-btn" 
                  data-id="{Id}" 
                  data-name="{product_name}" 
                  data-summary="{product_description}"
                  data-price="{product_price}"
                  data-quantity="1"
                  data-image="product_image/{product_image}">
            Add to Cart <span class="glyphicon glyphicon-shopping-cart"></span>
          </button>

        </div>
      </xsl:for-each>
    </div>
  </xsl:template>
</xsl:stylesheet>

属性中的花括号表示属性值模板,表示要计算的表达式,而不是按字面输出。