假设我有这个
XML节点:
<items> <item>...<item> <item>...<item> <item>...<item> <item>...<item> <item>...<item> ... </items>
其中有N个项目节点.
现在我想将它转换为一个包含4列的HTML表. (例如,如果N = 12,则有3个完整行,如果N = 27,则有7行,最后有3个单元)
我怎么能这样做?
我的直觉就是这样做,其中{{something}}是我不知道如何实现的:
<xsl:template match="items"> <table> <xsl:call-template name="partition-items"> <xsl:with-param name="skip" select="0" /> </xsl:call-template> </table> </xsl:template> <xsl:template name="partition-items"> <xsl:param name="skip" /> {{ if # of items in current node > $skip,output a row,and call partition-items($skip+4) }} <xsl:template />
我不知道如何实现的部分是
>如何制作谓词以测试当前节点中的项目元素数量
>如何获取当前节点中的第N个item元素
从评论更新
How to pad the last row with empty
<td />
elements so that each row
contains exactly the wanted cells?
那是我的工作解决方案.
原文链接:https://www.f2er.com/xml/292144.html由于您未提供所需的输出,因此根据您的需要,此特定输出可能不完整.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes"/> <xsl:template match="/*"> <table> <xsl:call-template name="make-columns"> <xsl:with-param name="nodelist" select="item"/> </xsl:call-template> </table> </xsl:template> <xsl:template name="make-columns"> <xsl:param name="nodelist"/> <xsl:param name="columns-number" select="4"/> <tr> <xsl:apply-templates select="$nodelist[ not(position() > $columns-number) ]"/> </tr> <!-- If some nodes are left,recursively call current template,passing only nodes that are left --> <xsl:if test="count($nodelist) > $columns-number"> <xsl:call-template name="make-columns"> <xsl:with-param name="nodelist" select="$nodelist[ position() > $columns-number ]"/> </xsl:call-template> </xsl:if> </xsl:template> <xsl:template match="item"> <td> <xsl:apply-templates/> </td> </xsl:template> </xsl:stylesheet>
测试输入:
<items> <item>1</item> <item>2</item> <item>3</item> <item>4</item> <item>5</item> <item>6</item> <item>7</item> <item>8</item> <item>9</item> <item>10</item> <item>11</item> <item>12</item> <item>13</item> <item>14</item> <item>15</item> <item>16</item> <item>17</item> <item>18</item> <item>19</item> <item>20</item> <item>21</item> <item>22</item> <item>23</item> <item>24</item> <item>25</item> <item>26</item> <item>27</item> </items>
输出:
<table> <tr> <td>1</td> <td>2</td> <td>3</td> <td>4</td> </tr> <tr> <td>5</td> <td>6</td> <td>7</td> <td>8</td> </tr> <tr> <td>9</td> <td>10</td> <td>11</td> <td>12</td> </tr> <tr> <td>13</td> <td>14</td> <td>15</td> <td>16</td> </tr> <tr> <td>17</td> <td>18</td> <td>19</td> <td>20</td> </tr> <tr> <td>21</td> <td>22</td> <td>23</td> <td>24</td> </tr> <tr> <td>25</td> <td>26</td> <td>27</td> </tr> </table>
请注意:您可以动态传递列号.
附加要求和编辑.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://localhost" exclude-result-prefixes="my"> <xsl:output method="html" indent="yes"/> <my:layout> <td/><td/><td/><td/> <td/><td/><td/><td/> <td/><td/><td/><td/> <td/><td/><td/><td/> </my:layout> <xsl:template match="/*"> <table> <xsl:call-template name="make-columns"> <xsl:with-param name="nodelist" select="item"/> </xsl:call-template> </table> </xsl:template> <xsl:template name="make-columns"> <xsl:param name="nodelist"/> <xsl:param name="columns-number" select="4"/> <tr> <xsl:apply-templates select="$nodelist[ not(position() > $columns-number) ]"/> <xsl:if test="count($nodelist) < $columns-number"> <xsl:copy-of select="document('')/*/my:layout/td[ position() <= $columns-number - count($nodelist) ]"/> </xsl:if> </tr> <!-- If some nodes are left,passing only nodes that are left --> <xsl:if test="count($nodelist) > $columns-number"> <xsl:call-template name="make-columns"> <xsl:with-param name="nodelist" select="$nodelist[ position() > $columns-number ]"/> </xsl:call-template> </xsl:if> </xsl:template> <xsl:template match="item"> <td> <xsl:apply-templates/> </td> </xsl:template> </xsl:stylesheet>
它可以应用于上一个示例或这个简洁的XML:
<items> <item>1</item> </items>
结果将是:
<table> <tr> <td>1</td> <td xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://localhost"></td> <td xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://localhost"></td> <td xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://localhost"></td> </tr> </table>
请注意:
>当项目元素少于列数时,添加元素的硬编码数据.
>额外的硬编码元素,如果列数将改变.
如果元素数量不会少于列数,则可以只应用具有相同谓词和不同模式的item元素.
最后编辑.用循环计数.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes"/> <xsl:template match="/*"> <table> <xsl:call-template name="make-columns"> <xsl:with-param name="nodelist" select="item"/> </xsl:call-template> </table> </xsl:template> <xsl:template name="make-columns"> <xsl:param name="nodelist"/> <xsl:param name="columns-number" select="4"/> <tr> <xsl:apply-templates select="$nodelist[ not(position() > $columns-number) ]"/> <xsl:if test="count($nodelist) < $columns-number"> <xsl:call-template name="empty-cells"> <xsl:with-param name="finish" select="$columns-number - count($nodelist)"/> </xsl:call-template> </xsl:if> </tr> <!-- If some nodes are left,passing only nodes that are left --> <xsl:if test="count($nodelist) > $columns-number"> <xsl:call-template name="make-columns"> <xsl:with-param name="nodelist" select="$nodelist[ position() > $columns-number ]"/> </xsl:call-template> </xsl:if> </xsl:template> <xsl:template match="item"> <td> <xsl:apply-templates/> </td> </xsl:template> <xsl:template name="empty-cells"> <xsl:param name="finish"/> <td/> <xsl:if test="not($finish = 1)"> <xsl:call-template name="empty-cells"> <xsl:with-param name="finish" select="$finish - 1"/> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet>