带有XSLT的动态HTML表

时间:2016-10-17 18:16:57

标签: html xslt-1.0

我需要遍历一组值并将它们打印到两列表中。

我考虑过以下解决方案(必须是xslt1)

<table class="main">

    <xsl:for-each select="Attribute/Gruppe">
        <xsl:if test="current()/@ID=20064490">
            <xsl:variable name="open_row"><![CDATA[<tr><td style="width:50%;">
                <xsl:value-of select="current()/@name" /></td>]]></xsl:variable>
            <xsl:variable name="closing_row"><![CDATA[<td style="width:50%;">
                <xsl:value-of select="current()/@name" /></td></tr>]]></xsl:variable>

            <xsl:variable name="table">
                <xsl:for-each select="*">
                    <xsl:choose>
                        <xsl:when test="(position() mod 2) = 1">
                            <xsl:value-of select="$open_row"
                                disable-output-escaping="yes" />

                        </xsl:when>
                        <xsl:otherwise>

                            <xsl:value-of select="$closing_row"
                                disable-output-escaping="yes" />

                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:for-each>
            </xsl:variable>
            <xsl:value-of select="$table"
                disable-output-escaping="yes" />
        </xsl:if>
    </xsl:for-each>
</table>

我现在使用position()修改了代码,以确定是否需要结束<tr>或开放</tr>

整个问题可能归结为您无法在XSLT中编写单个标记。并且disable-output-escaping无效。

生成的HTML应为https://jsfiddle.net/dwetctm6/

对于组中的所有节点。表中节点的顺序无关紧要。

此外假设遵循XML:

<bgroup>
  <NODE1>text</NODE1>
  <NODE2>text</NODE2>
  <NODE n-1>text</NODE n-1>
  <NODE n>text</NODE n>
</bgroup>

2 个答案:

答案 0 :(得分:0)

将节点划分为两列表非常简单 - 特别是如果顺序(跨越第一个或首先向下)无关紧要。

考虑以下样式表:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/bgroup">
    <table border="1">
        <xsl:for-each select="*[position() mod 2 = 1]">
            <tr>
                <td><xsl:value-of select="."/></td>
                <td><xsl:value-of select="following-sibling::*[1]"/></td>
            </tr>
        </xsl:for-each>
    </table>
</xsl:template>

</xsl:stylesheet>

应用于以下格式正确的 inpout:

<强> XML

<bgroup>
  <NODE1>A</NODE1>
  <NODE2>B</NODE2>
  <NODE3>C</NODE3>
  <NODE4>D</NODE4>
  <NODE5>E</NODE5>
</bgroup>

结果将是:

<table border="1">
   <tr>
      <td>A</td>
      <td>B</td>
   </tr>
   <tr>
      <td>C</td>
      <td>D</td>
   </tr>
   <tr>
      <td>E</td>
      <td/>
   </tr>
</table>

呈现为:

enter image description here

答案 1 :(得分:0)

嗯,首先必须做一些评论:

  1. 您必须了解XSLT的工作原理:它是一种模板语言,基于XML,必须以有序方式组成:每个打开的节点必须在同一个节点内关闭范围。 michael.hor257k是对的:你不应该在一个范围内打开一个节点,而是在另一个节点中关闭它。

  2. 此外,必须说您的输入XML似乎没有正确的结构:它应该是具有相同名称和类型的节点的重复。如果所有NODE-n节点在功能上或语义上相等,则它们应该具有相同的名称,没有问题:您可以拥有多个具有相同名称的节点。

  3. 现在,解决方案:假设您的XML就像发布它一样,并且因为不能基于具有不同名称的命名节点进行模板定义,所以我匹配所有子节点< bgroup根节点的/ em>。所以,XSL可以像这样简单:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="1.0">
        <xsl:output method="html" indent="yes"/>
    
        <xsl:template match="/bgroup">
            <html>
                <body>
                    <table>
                        <xsl:apply-templates select="*[position() mod 2 =1]"/>
                    </table>
                </body>
            </html>
        </xsl:template>
    
        <xsl:template match="*">
            <tr>
                <td><xsl:value-of select="."/></td>
                <td><xsl:value-of select="following-sibling::*[1]"/></td>
            </tr>
        </xsl:template>
    
    </xsl:stylesheet>
    

    重要的是,您要了解如何通过XSL语言的有序结构,只需一瞥XSL模板即可看到输出结果。