2014-12-22 5 views
-1

Я программист C#, но мне никогда не приходилось использовать XSLT. Я делаю сейчас, и я зацикливаюськак сгруппировать результаты

Учитывая некоторые xmls, мне нужно использовать XSLT для создания html-вывода. Немного погуляв, мне удалось собрать что-то вместе, пока мой босс не сказал мне, что «Таблицы и столбцы должны быть строить динамически в XSLT документ иХ было жестко прописывать имена столбцов. Все столбцы заголовок должен быть в горизонтальном положении.

Sample output

Любой помощь написание XSLT? Тот, который я сделал, был бесполезным, так как он жёстко столбцы

EDITED

<Generated> 
    <Employees> 
    <Employee name="Joe Bloggs"> 
     <Sales> 
     <Sale key="Sale-Id" value="2323" /> 
     <Sale key="Sale-Field1" value="Field1sale" /> 
     <Sale key="Sale-Field2" value="field2Sale" /> 
     </Sales> 
    </Employee> 
     <Employee name="Mark Bloggs"> 
     <Sales> 
     <Sale key="Sale-Id" value="334" /> 
     <Sale key="Sale-Field1" value="Field1sale" /> 
     <Sale key="Sale-Field2" value="field2Sale" /> 
     </Sales> 
    </Employee> 
    </Employees> 
    <Products> 
    <Product name="Rice"> 
     <Sales> 
     <Sale key="Sale-Id" value="334" /> 
     <Sale key="Sale-Field1" value="Field1sale" /> 
     <Sale key="Sale-Field2" value="field2Sale" /> 
     </Sales> 
    </Product> 
     <Product name="Wine"> 
      <Sales> 
      <Sale key="Sale-Id" value="32" /> 
      <Sale key="Sale-Field1" value="Field1sale" /> 
      <Sale key="Sale-Field2" value="field2Sale" /> 
      </Sales> 
    </Product> 
    </Products> 
</Generated> 

Я знаю, что это неправильно, но ИЗУЧИТЬ XSLT

 <?xml version="1.0" encoding="UTF-8"?> 
     <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
      <xsl:template match="/"> 
      <xsl:for-each select="(Generated/Employees/Employee)[1]/Sales/Sale[@key != 'Sale-Id']"> 
       <xsl:for-each select="Generated/Employees/Employee"> 
       </xsl:for-each> 
       <xsl:for-each select="./Sales/Sale[@key != 'Sale-Id']"> 
       </xsl:for-each> 
       <xsl:value-of select="@Value"/> 
      </xsl:for-each> 
      </xsl:template> 
     </xsl:stylesheet> 
+2

Боковое примечание. Всегда лучше включать код в текст, а не изображение, потому что я сомневаюсь, что кто-то, кто хочет протестировать ваше дело, позаботится о том, чтобы повторно ввести код из картинки вручную. И вам лучше показать свою попытку и указать, где она не работает, потому что сейчас ваш вопрос звучит как «напишите код для меня, пожалуйста», но StackOverflow не является службой написания кода. –

+0

@ AndyKorneyev да, вы правы, но сложно, когда вы вообще ничего не знаете о xslt.I также ставит свою попытку – developer9969

+0

Либо используйте XSL2.0, который содержит групповой узел, либо реализует [muenchian method] (http://www.jenitennison.com/xslt/grouping/muenchian.html) –

ответ

2

Ну, предполагая, что столбцы Sale-Field1 и т.д. являются одинаковыми для всех Employees и могут быть взяты из первой записи сотрудника (его не так - то задача значительно сложнее) - в основном все, что вам нужно, это <xsl:for-each> и <xsl:value-of>.

Второе требование - вы должны понимать в основном запросы xpath, поскольку они используются для извлечения данных из xml.

Таким образом, для создания вашего заголовка вы можете использовать:

<xsl:for-each select="(Generated/Employees/Employee)[1]/Sales/Sale[@key != 'Sale-Id']"> 

Это перебрать Sale узлы первого Employee узла, имеющего атрибут key не равный Sale-Id (как вам не нужно это в таблице) , На этой итерации вы можете получить атрибут value как <xsl:value-of select="@key" />

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

<xsl:for-each select="Generated/Employees/Employee"> 

И теперь после того, как вы получите имя сотрудника, как <xsl:value-of select="@name" />, вам нужен еще один вложенный цикл - по продажам:

<xsl:for-each select="./Sales/Sale[@key != 'Sale-Id']"> 

Примечание здесь мы используя относительный xpath, начинающийся с ./.И, наконец, в этом цикле вы можете получить свои значения как <xsl:value-of select="@value" />

И да - я не вижу никакой «группировки» в желаемом выводе таблицы, поэтому неясно, почему это было упомянуто в заголовке.

+0

спасибо за ваше время в ответе. Я добавил xslt, но он не создает результаты, я знаю его неправильно, но не уверен. Не могли бы вы посмотреть. – developer9969

+0

@ developer9969 в стороне от логики циклов в вашем коде (который выглядит совершенно неверно) - вы не генерируете никакой уценки html (например, '', '', '

' и т. Д.) И единственный результат в вашем code is '', который ничего не выведет, потому что xml имеет значение ** с учетом регистра **, а атрибуты в вашем примере xml - 'значение', а не' Value'. –

+0

Я очень опытный разработчик C#, но никогда не играл с xslt сделал много linq для xml и т. Д. Воистину, я должен изучить базовый xslt и сделать это, на самом деле у меня нет времени изучать xslt, так как у меня сумасшедший крайний срок, я застрял, я знаю, но там вы идете. В 10 лет dev я никогда не просил делать xslt. Я бы покончил с этим, если бы я мог жестко закодировать столбцы у меня был простой xslt, который работал – developer9969

3

Для строки заголовка, создать ячейку для каждого поля первого записи, используя значение @key. Для тела создайте строку для каждой записи, затем ячейку для каждого поля, на этот раз используя значение @value.

Предполагается, что каждая запись имеет точно такой же список полей. Используйте предикат , чтобы исключить некоторые поля из списка - например, Sale-Id в вашем примере.

Я не вижу, как это связано с группировкой.

+0

что мне делать, чтобы найти небольшой учебник, чтобы сказать то, что вы говорите. – developer9969

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