【问题标题】:XSLT comparing/sorting using a param passed from PHPXSLT 使用从 PHP 传递的参数进行比较/排序
【发布时间】:2010-08-03 20:52:39
【问题描述】:

我在使用从 PHP 传递到 xsl 文件的参数进行条件测试和排序时遇到问题。我可以根据测试字符串值进行匹配,并且可以使用显式名称进行排序,但也无法让变量起作用。这是 XSL 和相关 XML 的片段。

<Products xmlns:b="http://www.viator.com/affiliateXML2/base" xmlns="http://www.viator.com/vap">
<Product>
<ProductName>Washington DC Guided Day Tour</ProductName>
<ProductCategories>
<ProductCategory>
<Group>Tours &amp; Sightseeing</Group>
<Category>Full-day Tours</Category>
<Subcategory>City Tour</Subcategory>
</ProductCategory>
<ProductCategory>
<Group>Tours &amp; Sightseeing</Group>
<Category>Bus &amp; Minivan Tours</Category>
<Subcategory>City Coach Tour</Subcategory>
</ProductCategory>
</ProductCategories>
</Product>
</Products>

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:v="http://www.viator.com/vap">
<xsl:output method="html" omit-xml-declaration="yes" encoding="UTF-8"/>
<xsl:param name="sortBy"/>
<xsl:param name="catGroup"/>
<xsl:template match="v:Products">
    <xsl:for-each select="v:Product/v:ProductCategories/v:ProductCategory"> 
    <xsl:if test="string(v:Group) = $catGroup">
      <xsl:apply-templates select="../../."> 
      <xsl:sort select="$sortBy" order="ascending"/>
      </xsl:apply-templates>
    </xsl:if>
    </xsl:for-each>
</xsl:template>
<xsl:template match="v:Product">
<xsl:variable name="name" select="v:ProductName" />
<xsl:variable name="thumb" select="v:ProductImage/v:ThumbnailURL" />
<xsl:variable name="url" select="v:ProductURLs/v:ProductURL" /> 
<xsl:variable name="rating" select="v:ProductStarRating/v:AvgRating" />
<div class='rest_block'>
<ul>
<li class='name'><xsl:value-of select="v:ProductName"/></li>
<img class='stars' src='/images/global/hotels/{$rating}stars.png' alt='User Rated {$rating} Stars' />
<li><ul class='top'>
<li class='inline'><em>Category : </em>
<xsl:for-each select="v:ProductCategories/v:ProductCategory">
<xsl:value-of select="v:Group"/> 
<xsl:if test="position()!=last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each></li>
<li class='inline'><em>ID: </em><xsl:value-of select="v:ProductCode"/></li>
</ul></li>
<li class='blurb'><img class='h_thumb' src='{$thumb}' alt='{$name}' />
<em>Description:</em><xsl:value-of select="v:ProductText"/></li>
<li class='low_rate' id='tour'>$<xsl:value-of select="v:Pricing/v:PriceUSD"/><span>Per person rate</span><a class='sel_hotel' href='{$url}'>Select Tour</a></li>
<li><ul class='info'>
<li class='inline'><em>Commences: </em><xsl:value-of select="v:Commences"/></li><br/>
<li class='inline'><em>Duration: </em><xsl:value-of select="v:Duration"/></li>
</ul></li>
</ul>
</div>

</xsl:template>
</xsl:stylesheet>

这是我第一次使用 XSLT 的真实体验,即使在阅读了本网站上多个出色的答案之后,我也无法让参数来工作我习惯于变量工作的方式。我知道参数正在被传递,并且它们具有我想要的值,因为我替换了另一个变量引用。我需要帮助以正确的方式引用参数。任何帮助表示赞赏,谢谢。


更新: @Alejandro:我没有包括那些,因为它们正在动态更改并且没有真正的默认值。

<xsl:param name="sortBy" select="v:Rank"/> 

(默认为排序排序无论如何这就是 XML 的格式)

<xsl:param name="catGroup" select="'Day Trips &amp; Excursions'" /> 

(这是一个字符串值)

这就是我用 PHP 传递它们的方式:

$processor->setParameter('', 'sortBy', 'v:'.$_GET['sort']); 
$processor->setParameter('', 'catGroup', 'Day Trips &amp; Excursions'); 

【问题讨论】:

  • @Alejandro:用该信息更新了原始帖子

标签: php xml xslt params


【解决方案1】:

IF $sortBy param 它是一个元素 QName,你可以这样做:

<xsl:sort select="*[name() = $sortBy]" order="ascending"/> 

编辑:这是 $sortBy 的正确声明(它必须是字符串):

<xsl:param name="sortBy" select="'v:Rank'"/> 

【讨论】:

  • 我之前曾根据此处的另一个答案尝试过此操作,并希望它可以正常工作,但无法正常工作。当我引用它时,该参数的值为“v:ProductName”(只是在稍后的 xsl 中将 img 标记中的 {$rating} 替换为 {$sortBy}),但仍然没有排序。如果我明确使用 sort select="v:ProductName",它将很好地排序。不确定这是否是命名空间问题,但如果是,其他模板应该根本无法引用它,对吧?
猜你喜欢
  • 2023-03-22
  • 2020-07-10
  • 2012-09-26
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 2014-08-06
  • 1970-01-01
相关资源
最近更新 更多