2013-11-22 4 views
0

Мне нужен цикл (xsl:for-each) через XML, и он вернет x узлов, которые имеют одинаковые имена элементов и макет узла.Можно ли объединить имя переменной в XSLT?

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

Так мне было интересно, если я могу создавать нумерованные имена переменных на лету, как variable0, variable1 и т.д.

Я попытался использовать <xsl:variable name="concat(name, position())" /> но это не допускается.

Известно ли вам, как достичь этого или это абсолютно невозможно?

благодаря

данных XML:

<page id="11045138"> 
    <name>SSC NA XML</name> 
    <description/> 
    <server>reg6699cic01</server> 
    <created>2013/11/18 07:16:53 PM</created> 
    <adhocmessage/> 
    <workgroups> 
     <workgroup> 
      <name>SSC_NA_BWDO_All</name> 
      <agents>17</agents> 
      <agentsavailable>2</agentsavailable> 
      <agentsloggedin>5</agentsloggedin> 
      <longestavailable>00:01:28</longestavailable> 
      <longestoutbound>-</longestoutbound> 
      <longestinbound>-</longestinbound> 
      <longestnonacd>-</longestnonacd> 
      <numbernonacd>0</numbernonacd> 
      <numberoninbound>0</numberoninbound> 
      <numberoninboundinacw>0</numberoninboundinacw> 
      <numberonoutbound>0</numberonoutbound> 
      <numberonoutboundinacw>0</numberonoutboundinacw> 
     </workgroup> 
     <workgroup> 
      <name>SSC_NA_DR_All</name> 
      <agents>10</agents> 
      <agentsavailable>0</agentsavailable> 
      <agentsloggedin>0</agentsloggedin> 
      <longestavailable>-</longestavailable> 
      <longestoutbound>-</longestoutbound> 
      <longestinbound>-</longestinbound> 
      <longestnonacd>-</longestnonacd> 
      <numbernonacd>0</numbernonacd> 
      <numberoninbound>0</numberoninbound> 
      <numberoninboundinacw>0</numberoninboundinacw> 
      <numberonoutbound>0</numberonoutbound> 
      <numberonoutboundinacw>0</numberonoutboundinacw> 
     </workgroup> 
    </workgroups> 
</page> 

XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
           xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="html" encoding="utf-8" indent="yes"/> 
    <xsl:template match="/"> 
     <xsl:for-each select="//page/workgroups/workgroup"> 
      <xsl:variable name="foo-elements" select="name"/> 
      <html> 
       <head> 
        <title>testing</title> 
       </head> 
       <body> 
        Body Text<br/> 
        <xsl:value-of select="$foo-elements[position()]"/> 
       </body> 
      </html> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

Что я требую, чтобы эти данные будут отображаться в виде таблицы, которая показывает эти значения (и более), как это

Data elements [0]    || Data elements [0+1] 
Data elements [0+2]   || Data elements [0+3] 
         / /
Data elements [0+m]   || Data elements [0+n] 

Это может actualy требуется 3 строки

Data elements [0]    || Data elements [0+1]  || Data elements [0+2] 
Data elements [0+3]   || Data elements [0+4]  || Data elements [0+5] 
         / /
Data elements [0+k]   || Data elements [0+l]  || Data elements [0+m] 

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

Благодаря

+0

«Одна длинная строка без разделителей», скорее всего, XmlNode. Очевидно, я не могу сказать, не видя ваш код. –

+0

Вы отметили свой вопрос как 'xslt-2.0', но ваш код стилей имеет' version = "1.0" '. Пожалуйста, четко укажите, хотите ли вы решение XSLT 1.0 или 2.0. –

+0

Мне нужен он для Мартина, поэтому я пометил его за это – NiteOwls

ответ

1

Если вы хотите создать таблицу HTML с определенным числом столбцов, то вы можете использовать его с XSLT 1.0 или 2.0 путем обработки workgroup[position() mod $row-count = 1] создать строку и . | following-sibling::workgroup[position() &lt; $row-count] создать ячейку (в другом режиме):

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:param name="row-count" select="3"/> 

<xsl:output method="html" indent="yes"/> 

<xsl:template match="/"> 
    <html> 
    <body> 
     <xsl:apply-templates select="//workgroups"/> 
    </body> 
    </html> 
</xsl:template> 

<xsl:template match="workgroups"> 
    <table> 
    <thead> 
     <tr> 
     <xsl:apply-templates select="descendant::*[position() &lt;= $row-count]" mode="th"/> 
     </tr> 
    </thead> 
    <tbody> 
     <xsl:apply-templates select="workgroup[position() mod $row-count = 1]"/> 
    </tbody> 
    </table> 
</xsl:template> 

<xsl:template match="*" mode="th"> 
    <th> 
    <xsl:value-of select="position()"/> 
    </th> 
</xsl:template> 

<xsl:template match="workgroup"> 
    <tr> 
    <xsl:apply-templates select=". | following-sibling::workgroup[position() &lt; $row-count]" mode="cell"/> 
    </tr> 
</xsl:template> 

<xsl:template match="workgroup" mode="cell"> 
    <td> 
    <xsl:value-of select="name"/> 
    </td> 
</xsl:template> 

</xsl:stylesheet> 

Это превращает

<page id="11045138"> 
    <name>SSC NA XML</name> 
    <description/> 
    <server>reg6699cic01</server> 
    <created>2013/11/18 07:16:53 PM</created> 
    <adhocmessage/> 
    <workgroups> 
     <workgroup> 
      <name>SSC_NA_BWDO_All</name> 
      <agents>17</agents> 
      <agentsavailable>2</agentsavailable> 
      <agentsloggedin>5</agentsloggedin> 
      <longestavailable>00:01:28</longestavailable> 
      <longestoutbound>-</longestoutbound> 
      <longestinbound>-</longestinbound> 
      <longestnonacd>-</longestnonacd> 
      <numbernonacd>0</numbernonacd> 
      <numberoninbound>0</numberoninbound> 
      <numberoninboundinacw>0</numberoninboundinacw> 
      <numberonoutbound>0</numberonoutbound> 
      <numberonoutboundinacw>0</numberonoutboundinacw> 
     </workgroup> 
     <workgroup> 
      <name>SSC_NA_DR_All</name> 
      <agents>10</agents> 
      <agentsavailable>0</agentsavailable> 
      <agentsloggedin>0</agentsloggedin> 
      <longestavailable>-</longestavailable> 
      <longestoutbound>-</longestoutbound> 
      <longestinbound>-</longestinbound> 
      <longestnonacd>-</longestnonacd> 
      <numbernonacd>0</numbernonacd> 
      <numberoninbound>0</numberoninbound> 
      <numberoninboundinacw>0</numberoninboundinacw> 
      <numberonoutbound>0</numberonoutbound> 
      <numberonoutboundinacw>0</numberonoutboundinacw> 
     </workgroup> 
     <workgroup> 
      <name>3</name> 
     </workgroup> 
     <workgroup> 
      <name>4</name> 
     </workgroup> 
     <workgroup> 
      <name>5</name> 
     </workgroup> 
     <workgroup> 
      <name>6</name> 
     </workgroup> 
    </workgroups> 
</page> 

в

<html> 
    <body> 
     <table> 
     <thead> 
      <tr> 
       <th>1</th> 
       <th>2</th> 
       <th>3</th> 
      </tr> 
     </thead> 
     <tbody> 
      <tr> 
       <td>SSC_NA_BWDO_All</td> 
       <td>SSC_NA_DR_All</td> 
       <td>3</td> 
      </tr> 
      <tr> 
       <td>4</td> 
       <td>5</td> 
       <td>6</td> 
      </tr> 
     </tbody> 
     </table> 
    </body> 
</html> 
+0

Я не знаю, есть ли у вас пример где-нибудь? – NiteOwls

+1

@NiteOwls, я думаю, вы должны отредактировать свой вопрос с примера своего ввода, данных, которые вы хотите, и вашего подхода, тогда мы можем показать вам XSLT 2.0 для выбора данных. –

+0

Мартин, это на самом деле то, что я ищу, большое спасибо за это! – NiteOwls

0

Вы не можете сделать это так, как вы предлагаете. Если вы сообщите нам, какую проблему вы пытаетесь решить, тогда мы сможем рассказать вам, как ее решить.

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