2015-01-05 2 views
0

Я пытаюсь добавить уникальные значения элемента XML-элемента в список выбора. Вот то, что я до сих порДобавить уникальные значения XML-элемента в список выбора

XML:

<Student> 
    <record> 
    <Name>Jack</Name> 
    </record> 
    <record> 
    <Name>Jack</Name> 
    </record> 
    <record> 
    <Name>John</Name> 
    </record> 
    <record> 
    <Name>John</Name> 
    </record> 
    <record> 
    <Name>John</Name> 
    </record> 
    <record> 
    <Name>Jill</Name> 
    </record> 
    <record> 
    <Name>Jill</Name> 
    </record> 
    <record> 
    <Name>James</Name> 
    </record> 
</Student> 

XSLT:

<xsl:key name="NameKey" match="Name" use="."/> 

    <xsl:template match="Student"> 
    <table> 
     <tr> 
     <th>Name</th> 
     <td> 
      <select> 
       <xsl:for-each select="record"> 
       <option> 
       <xsl:element name="Name"> 
        <xsl:value-of select="Name[generate-id() = generate-id(key('NameKey',.)[1])]" /> 
       </xsl:element> 
       </option> 
       </xsl:for-each>    
      </select> 
     </td> 
     </tr> 
     <xsl:apply-templates select="/record" /> 
    </table> 
    </xsl:template> 
</xsl:stylesheet> 

Я успешно получать уникальные значения в списке, но список также отображает пустую строку не уникальные значения в списке. Так что мой список имеет следующие значения:

Jack 

John 


Jill 

James 

Есть ли способ, чтобы избавиться от этих пустых значений строк в списке?

+0

Пожалуйста, покажите нам пример ввода XML, чтобы мы могли воспроизвести проблему. - P.S. Я не вижу, что вы собираете ** атрибут ** значений; слово * attribute * имеет очень точное значение в XML. –

+0

@ michael.hor257k Я обновил свой вопрос. Извините за пропущенный тип, я имел в виду значения элементов – user793468

ответ

1

Есть ли способ избавиться от этих пустых значений строки в списке?

Да, просто переместите предикат с помощью ключевого поиска на xsl:for-each. С вашим текущим кодом все эти узлы переданы в xsl:for-each, включая дубликаты.

Кстати, эта линия

<xsl:apply-templates select="/record" /> 

ли ничего не делать, потому что внешний узел элемента не называется record. Каково было ваше намерение здесь?

таблицы стилей XSLT

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:output method="html" encoding="UTF-8" indent="yes" /> 
    <xsl:key name="NameKey" match="Name" use="."/> 

    <xsl:template match="Student"> 
    <table> 
     <tr> 
     <th>Name</th> 
     <td> 
      <select> 
       <xsl:for-each select="record/Name[generate-id() = generate-id(key('NameKey',.)[1])]"> 
       <option> 
       <xsl:element name="Name"> 
        <xsl:value-of select="." /> 
       </xsl:element> 
       </option> 
       </xsl:for-each>    
      </select> 
     </td> 
     </tr> 
     <xsl:apply-templates select="/record" /> 
    </table> 
    </xsl:template> 
</xsl:stylesheet> 

HTML Output

<table> 
    <tr> 
     <th>Name</th> 
     <td> 
     <select> 
      <option> 
       <Name>Jack</Name> 
      </option> 
      <option> 
       <Name>John</Name> 
      </option> 
      <option> 
       <Name>Jill</Name> 
      </option> 
      <option> 
       <Name>James</Name> 
      </option> 
     </select> 
     </td> 
    </tr> 
</table> 

Вынесено HTML

enter image description here

+0

Спасибо! Я удалил «" line – user793468

1

Я хотел бы добавить, что этого можно достичь, используя [not(.=preceding::*)].

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:output method="html" encoding="UTF-8" indent="yes" /> 

    <xsl:template match="Student"> 
     <table> 
      <tr> 
       <th>Name</th> 
       <td> 
        <select> 
         <xsl:for-each select="record/Name[not(.=preceding::*)]"> 
          <option> 
           <xsl:element name="Name"> 
            <xsl:value-of select="." /> 
           </xsl:element> 
          </option> 
         </xsl:for-each>    
        </select> 
       </td> 
      </tr> 
      <xsl:apply-templates select="/record" /> 
     </table> 
    </xsl:template> 
</xsl:stylesheet> 

Я лично считаю, что более ясно, что вы обрабатываете каждый элемент Name только один раз.

+0

Это нехороший метод - см. Здесь почему: http://www.jenitennison.com/xslt/grouping/muenchian.html –

Смежные вопросы