2015-12-22 4 views
0

Я смотрел на Muenchian метод группирования с XSLT,XSLT группировка с заранее заданной последовательности

Данные аналогична этой

<Root> 
    <Entries> 
    <Entry Attribute="A"/> 
    <Entry Attribute="B"/> 
    <Entry Attribute="C"/> 
    </Entries> 
</Root> 

Но кроме того, я должен был иметь предопределенный порядок сортировки - по atttributes моих элементов. Так что я смотрел, имеющий раздел пользовательских XML в XSLT с порядком сортировки и вставить его в переменную что-то вроде этого

<xsl:variable name="sortorder"select="document('')/*/my:data/my:ordering/my:value"/> 

значения являются, например, C, B, A, который является порядком, а также группирует заголовок

Затем мне показалось, что вместо использования функции key() в методе Muenchian я мог бы просто перебирать значения переменной.

Как это

<xsl:template match="Entries"> 
<xsl:for-each select="$sortorder/value"> 
    <groupheader><xsl:value-of select="."/></groupheader> 

... , а затем применить шаблоны

<xsl:apply-templates select="Entry[@sortattribute=current()"></xsl:apply-templates> 

Но я нету получил его на работу. Любые советы о том, как достичь этого? Я на правильном пути? Я подозреваю, что я отбрасываю процессор с циклом по переменной в контексте < Ввод >, но я не знаю, как его исправить.

+0

Как правило, более полный вывод кодировки не разреженных однострочных объектов, особенно XSLT, чтобы увидеть все шаблоны, образцы данных и желаемые результаты, которые помогут установить специфику на общих терминах. – Parfait

+0

«Я не знаю, как это исправить». «Я не знаю, как исправить это, потому что вы не показываете нам полную таблицу стилей. См. Http://stackoverflow.com/help/mcve –

ответ

1

Вот обобщенный пример, который вы могли бы использовать в качестве руководства:

XML

<input> 
    <item category="Winter">Alpha</item> 
    <item category="Autumn">Bravo</item> 
    <item category="Spring">Charlie</item> 
    <item category="Summer">Delta</item> 
    <item category="Spring">Echo</item> 
    <item category="Autumn">Foxtrot</item> 
    <item category="Spring">Golf</item> 
    <item category="Summer">Hotel</item> 
    <item category="Winter">India</item> 
    <item category="Autumn">Juliet</item> 
    <item category="Summer">Kilo</item> 
    <item category="Winter">Lima</item> 
    <item category="Summer">Mike</item> 
    <item category="Spring">November</item> 
    <item category="Spring">Oscar</item> 
    <item category="Autumn">Papa</item> 
    <item category="Winter">Quebec</item> 
    <item category="Summer">Romeo</item> 
    <item category="Spring">Sierra</item> 
    <item category="Summer">Tango</item> 
    <item category="Spring">Uniform</item> 
    <item category="Autumn">Victor</item> 
    <item category="Summer">Whiskey</item> 
    <item category="Winter">Xray</item> 
    <item category="Summer">Yankee</item> 
    <item category="Autumn">Zulu</item> 
</input> 

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="http://www.example.com/my" 
exclude-result-prefixes="my"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<my:categories> 
    <category>Spring</category> 
    <category>Summer</category> 
    <category>Autumn</category> 
    <category>Winter</category> 
</my:categories> 

<xsl:variable name="root" select="/"/> 

<xsl:template match="/"> 
    <output> 
     <xsl:for-each select="document('')/xsl:stylesheet/my:categories/category"> 
      <group category="{.}"> 
       <xsl:apply-templates select="$root/input/item[@category=current()]"/> 
      </group> 
     </xsl:for-each> 
    </output> 
</xsl:template> 

<xsl:template match="item"> 
    <xsl:copy-of select="."/> 
</xsl:template> 

</xsl:stylesheet> 

Результат

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <group category="Spring"> 
     <item category="Spring">Charlie</item> 
     <item category="Spring">Echo</item> 
     <item category="Spring">Golf</item> 
     <item category="Spring">November</item> 
     <item category="Spring">Oscar</item> 
     <item category="Spring">Sierra</item> 
     <item category="Spring">Uniform</item> 
    </group> 
    <group category="Summer"> 
     <item category="Summer">Delta</item> 
     <item category="Summer">Hotel</item> 
     <item category="Summer">Kilo</item> 
     <item category="Summer">Mike</item> 
     <item category="Summer">Romeo</item> 
     <item category="Summer">Tango</item> 
     <item category="Summer">Whiskey</item> 
     <item category="Summer">Yankee</item> 
    </group> 
    <group category="Autumn"> 
     <item category="Autumn">Bravo</item> 
     <item category="Autumn">Foxtrot</item> 
     <item category="Autumn">Juliet</item> 
     <item category="Autumn">Papa</item> 
     <item category="Autumn">Victor</item> 
     <item category="Autumn">Zulu</item> 
    </group> 
    <group category="Winter"> 
     <item category="Winter">Alpha</item> 
     <item category="Winter">India</item> 
     <item category="Winter">Lima</item> 
     <item category="Winter">Quebec</item> 
     <item category="Winter">Xray</item> 
    </group> 
</output> 

Обратите внимание на использование переменной $root, чтобы вернуть контекст во входной XML-документ.

+0

Корневая переменная $ root сделала трюк. Спасибо за отличный ответ! – goorj

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