Как использовать XSLT для создания отдельных значений


1 Answers

Вот решение XSLT 1.0, которое я использовал в прошлом, я думаю, что оно более кратким (и читаемым), чем использование функции generate-id() .

  <xsl:template match="/">           
    <ul> 
      <xsl:for-each select="//products/product[not(.=preceding::*)]">
        <li>
          <xsl:value-of select="."/>
        </li>   
      </xsl:for-each>            
    </ul>
  </xsl:template>

Возвращает:

<ul xmlns="http://www.w3.org/1999/xhtml">
  <li>laptop</li>
  <li>charger</li>
  <li>headphones</li>
</ul>
Question

У меня XML такой:

<items>
  <item>
    <products>
      <product>laptop</product>
      <product>charger</product>
    </products>
  </item>
  <item>
    <products>
      <product>laptop</product>
      <product>headphones</product>  
    </products>  
  </item>
</items>

Я хочу, чтобы он выводился как

laptop
charger
headphones

Я пытался использовать distinct-values() но я предполагаю, что я делаю что-то неправильно. Может ли кто-нибудь сказать мне, как достичь этого, используя distinct-values() ? Благодарю.

<xsl:template match="/">            
  <xsl:for-each select="//products/product/text()">
    <li>
      <xsl:value-of select="distinct-values(.)"/>
    </li>               
  </xsl:for-each>
</xsl:template>

но он дает мне вывод следующим образом:

<li>laptop</li>
<li>charger</li>
<li>laptop></li>
<li>headphones</li>



Я столкнулся с этой проблемой при работе с рендерингом Sitecore XSL. Оба подхода, которые использовали key () и подход, который использовал предыдущую ось, выполнялись очень медленно. Я закончил использование метода, аналогичного key (), но для этого не требуется использовать key (). Он работает очень быстро.

<xsl:variable name="prods" select="items/item/products/product" />
<xsl:for-each select="$prods">
  <xsl:if test="generate-id() = generate-id($prods[. = current()][1])">
    <xsl:value-of select="." />
    <br />
  </xsl:if>
</xsl:for-each>



Related



Tags

xslt