2010-02-01 3 views
1

У меня есть следующий XML-файл:Нужна помощь с XSLT 1.0 и группировка

<Promotions> 
    <Promotion> 
    <Category>Arts &amp; Entertainment</Category> 
    <Client>Client Five</Client> 
    <Title>Get your Free 2</Title> 
    </Promotion> 
    <Promotion> 
    <Category>Arts &amp; Entertainment</Category> 
    <Client>Client 5</Client> 
    <Title>Get your Free 4</Title> 
    </Promotion> 
    <Promotion> 
    <Category>Arts &amp; Entertainment</Category> 
    <Client>Client five</Client> 
    <Title>Get your Free 5</Title> 
    </Promotion> 
    <Promotion> 
    <Category>Community &amp; Neighborhood</Category> 
    <Client>Client 1</Client> 
    <Title>Get your Free 1</Title> 
    </Promotion> 
    <Promotion> 
    <Category>Education</Category> 
    <Client>Client 3</Client> 
    <Title>Get Your Free 3</Title> 
    </Promotion> 

Я хотел бы группу по категориям. Я попытался следующие, и продолжать получать ошибки:

string xslmarkup = @" 
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> 
    <xsl:output method='html' /> 

    <xsl:key name='Categories' match='Promotions/Promotion' use='Category'/> 

    <xsl:template match='/'> 
    <xsl:apply-templates select=' 
     /Promotions/Promotion[ 
     generate-id() 
     = 
     generate-id(key ('Categories',Category)[1]) 
     ] 
    '/> 
    </xsl:template> 

    <xsl:template match='Promotion'> 
    <xsl:value-of select='Title'/> 
    </xsl:template> 
</xsl:stylesheet> 
" 

Я хотел что-то вроде этого, как выход:

<h1>Arts &amp; Entertainment</h1> 
    <ul>Client Five</ul> 
    <ul>Get your Free 2</ul> 

    <ul>Client 5</ul> 
    <ul>Get your Free 4</ul> 

    <ul>Client five</ul> 
    <ul>Get your Free 5</ul> 

    <h1>Community &amp; Neighborhood</h1> 
    <ul>Client 1</ul> 
    <ul>Get your Free 1</ul> 

    <h1>Education</h1> 
    <ul>Client 3</ul> 
    <ul>Get Your Free 3</ul> 
+0

Я уверен, что вы делаете \ * не \ * хотите, чтобы результат как образец вы показываете. В вашем образце вывода отсутствует какая-либо структура, все, что осталось, - это порядок узлов. Это довольно плохое использование XML, и вы должны избегать этого. Также: Какая ошибка вы получаете? – Tomalak

+0

Это не совсем то, что я хочу, мне просто нужно сгруппировать их в неупорядоченный список, сгруппированный по категориям. –

+0

Какие ошибки у вас есть? –

ответ

5

Я думаю, что ошибка вашего процитировать, но логика оказывается испорчен слишком. Это не очень хорошее решение, но оно должно помочь вам на правильном пути.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" /> 
    <xsl:key name="categories" match="Category" use="." /> 
    <xsl:template match="/"> 
     <xsl:for-each select="/Promotions/Promotion/Category[ 
     generate-id(.) = generate-id(key('categories', .)[1]) 
     ]"> 
     <xsl:variable name="cname" select="." /> 
     <Category title="{.}"> 
     <xsl:for-each select="/Promotions/Promotion[Category=$cname]"> 
      <Title> 
      <xsl:value-of select="Title" /> 
      </Title> 
     </xsl:for-each> 
     </Category> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

дает вам:

<Category title="Arts &amp; Entertainment"> 
    <Title>Get your Free 2</Title> 
    <Title>Get your Free 4</Title> 
    <Title>Get your Free 5</Title> 
</Category> 
<Category title="Community &amp; Neighborhood"> 
    <Title>Get your Free 1</Title> 
</Category> 
<Category title="Education"> 
    <Title>Get Your Free 3</Title> 
</Category> 
+0

@ gum411: код отступа блокируется четырьмя пробелами (выберите текст и нажмите CTRL-K или используйте кнопку редактора «010101»). Отредактируйте сообщение, чтобы понять, что я имею в виду. – Tomalak

+0

+1 для ответа. Обратите внимание, что '' эквивалентно клавише '' , – Tomalak

+0

@gum как я могу изменить XSLT для вывода: Arts & Entertainment вместо <Категория название = "Arts & Entertainment"> –

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