将XML转换为多个HTML表

将XML转换为多个HTML表,html,xml,xslt,Html,Xml,Xslt,我有一个需要转换为HTML的XML文件。它将被转换成多个表,每个表有16行,其中第一行XML数据将成为每个表的相同第一行。每个表将获得一个唯一的ID xml示例文件的结构如下(被截断-通常为几百行): 截至2014年4月17日 亚当斯,马丁多布:11/02/38 亚当斯,伊利诺伊州:04/06/37 阿莱尼兹,阿列克斯多布:08/09/37 阿尔福德·贾森多布:8/11/35 快板:09/01/38 阿尔默,桑德多布:01/09/33 阿尔瓦雷赫克托布:07/04/30 阿马尔,图马多布:07

我有一个需要转换为HTML的XML文件。它将被转换成多个表,每个表有16行,其中第一行XML数据将成为每个表的相同第一行。每个表将获得一个唯一的ID

xml示例文件的结构如下(被截断-通常为几百行):


截至2014年4月17日
亚当斯,马丁多布:11/02/38
亚当斯,伊利诺伊州:04/06/37
阿莱尼兹,阿列克斯多布:08/09/37
阿尔福德·贾森多布:8/11/35
快板:09/01/38
阿尔默,桑德多布:01/09/33
阿尔瓦雷赫克托布:07/04/30
阿马尔,图马多布:07/09/32
阿农,贾斯丁德:05/06/37
安森,特雷多布:01/18/35
阿普圭,约尔格多布:12/05/34
阿普达卡,CODYDOB:02/01/33
马里奥多布阿洛:04/03/30
夏奈尔阿肯色州,多布:06/07/39
阿尔阿加,阿丹多布:08/30/32
空中交通管制,MICHAELDOB:05/01/37
巴伊,詹姆斯多布:03/05/35
贝克,阿勒克多布:02/02/31
鲍德温,PHDOB:08/08/39
BALLWEBE RRYDOB:04/06/34
带,T X2DOB:02/09/30
根据示例文件,生成的HTML文件应如下所示(显然,较大的XML文件将生成更多的表):


名单日期:2014年4月21日
亚当斯,马丁多布:11/02/38
亚当斯,伊利诺伊州:04/06/37
阿莱尼兹,阿列克斯多布:08/09/37
阿尔福德·贾森多布:8/11/35
快板:09/01/38
阿尔默,桑德多布:01/09/33
阿尔瓦雷赫克托布:07/04/30
阿马尔,图马多布:07/09/32
阿农,贾斯丁德:05/06/37
安森,特雷多布:01/18/35
阿普圭,约尔格多布:12/05/34
阿普达卡,CODYDOB:02/01/33
马里奥多布阿洛:04/03/30
夏奈尔阿肯色州,多布:06/07/39
阿尔阿加,阿丹多布:08/30/32
名单日期:2014年4月21日
空中交通管制,MICHAELDOB:05/01/37
巴伊,詹姆斯多布:03/05/35
贝克,阿勒克多布:02/02/31
鲍德温,PHDOB:08/08/39
BALLWEBE RRYDOB:04/06/34
带,T X2DOB:02/09/30
基于其他几个将XML转换为表的实例,我假设需要利用XSLT来完成这项工作。我遇到的问题是,我无法将and字段分解为单独的元素,同时仍能正确生成表的其余部分。它要么是一个大表,要么是每行只有一个元素的多个表

编辑:

下面的XSLT为我提供了一个格式正确的大表。我只是不知道如何将其传递到几个16行表:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<table id="1">
<tr><td colspan="2" align="center"><h2><xsl:value-of select="Data/Head/Title"/></h2></td></tr>
<xsl:for-each select="Data/Person">
<tr>
<td><xsl:value-of select="Name"/></td>
<td><xsl:value-of select="DOB"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>


我非常感谢您在这方面给予的帮助。

我似乎看错了您的问题。我最初认为您的XML也被分成多个16人的组,但现在我再看一遍,它不是。你的问题很难回答,我不知道有什么好的解决办法。我经常做的就是注入
,如下所示:

<xsl:text disable-output-escaping="yes"><![CDATA[<some_tags>]]></xsl:text>
]>
所以你能做的是:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <xsl:for-each select="Data/Person">
                    <xsl:if test="(position() mod 16) = 1">
                        <xsl:text disable-output-escaping="yes"><![CDATA[<table id="]]></xsl:text>
                        <xsl:value-of select="(position() + 15) div 16"/>
                        <xsl:text disable-output-escaping="yes"><![CDATA[">]]></xsl:text>
                        <tr><td colspan="2" align="center"><h2><xsl:value-of select="/Data/Head/Title"/></h2></td></tr>
                    </xsl:if>
                    <tr>
                        <td><xsl:value-of select="Name"/></td>
                        <td><xsl:value-of select="DOB"/></td>
                    </tr>
                    <xsl:if test="(position() mod 16) = 0 or position() = last()">
                        <xsl:text disable-output-escaping="yes"><![CDATA[</table>]]></xsl:text>
                    </xsl:if>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

]]>
]]>

这里有一个不使用DOE的选项(
禁用输出转义=“yes”

可能有更好/更有效的解决方案,但我主要使用XSLT2.0,在那里分组更容易

XML输入

<Data>
    <Head><Title>As of April 17, 2014</Title></Head>
    <Person><Name>ADAMS,MARTIN</Name><DOB>DOB: 11/02/38</DOB></Person>
    <Person><Name>ADAMS,ICHAEL</Name><DOB>DOB: 04/06/37</DOB></Person>
    <Person><Name>ALANIZ, ALEX</Name><DOB>DOB: 08/09/37</DOB></Person>
    <Person><Name>ALFORD JASON</Name><DOB>DOB: 08/11/35</DOB></Person>
    <Person><Name>ALLEGR ERICK</Name><DOB>DOB: 09/01/38</DOB></Person>
    <Person><Name>ALMER,XANDER</Name><DOB>DOB: 01/09/33</DOB></Person>
    <Person><Name>ALVAREHECTOR</Name><DOB>DOB: 07/04/30</DOB></Person>
    <Person><Name>AMAR,  TUMAA</Name><DOB>DOB: 07/09/32</DOB></Person>
    <Person><Name>ANON, JUSTIN</Name><DOB>DOB: 05/06/37</DOB></Person>
    <Person><Name>ANSON, TERRY</Name><DOB>DOB: 01/18/35</DOB></Person>
    <Person><Name>APGUI, JORGE</Name><DOB>DOB: 12/05/34</DOB></Person>
    <Person><Name>APDACA, CODY</Name><DOB>DOB: 02/01/33</DOB></Person>
    <Person><Name>ARLLO, MARIO</Name><DOB>DOB: 04/03/30</DOB></Person>
    <Person><Name>AR, CHANELLE</Name><DOB>DOB: 06/07/39</DOB></Person>
    <Person><Name>AR AGA, ADAN</Name><DOB>DOB: 08/30/32</DOB></Person>
    <Person><Name>ATC, MICHAEL</Name><DOB>DOB: 05/01/37</DOB></Person>
    <Person><Name>BAI Y, JAMES</Name><DOB>DOB: 03/05/35</DOB></Person>
    <Person><Name>BAKER, ALECD</Name><DOB>DOB: 02/02/31</DOB></Person>
    <Person><Name>BALDWIN , PH</Name><DOB>DOB: 08/08/39</DOB></Person>
    <Person><Name>BALLWEBE RRY</Name><DOB>DOB: 04/06/34</DOB></Person>
    <Person><Name>BANDLE, T X2</Name><DOB>DOB: 02/09/30</DOB></Person>
</Data>
<html>
   <body>
      <table id="1">
         <tr>
            <td colspan="2" align="center">
               <h2>As of April 17, 2014</h2>
            </td>
         </tr>
         <tr>
            <td>ADAMS,MARTIN</td>
            <td>DOB: 11/02/38</td>
         </tr>
         <tr>
            <td>ADAMS,ICHAEL</td>
            <td>DOB: 04/06/37</td>
         </tr>
         <tr>
            <td>ALANIZ, ALEX</td>
            <td>DOB: 08/09/37</td>
         </tr>
         <tr>
            <td>ALFORD JASON</td>
            <td>DOB: 08/11/35</td>
         </tr>
         <tr>
            <td>ALLEGR ERICK</td>
            <td>DOB: 09/01/38</td>
         </tr>
         <tr>
            <td>ALMER,XANDER</td>
            <td>DOB: 01/09/33</td>
         </tr>
         <tr>
            <td>ALVAREHECTOR</td>
            <td>DOB: 07/04/30</td>
         </tr>
         <tr>
            <td>AMAR,  TUMAA</td>
            <td>DOB: 07/09/32</td>
         </tr>
         <tr>
            <td>ANON, JUSTIN</td>
            <td>DOB: 05/06/37</td>
         </tr>
         <tr>
            <td>ANSON, TERRY</td>
            <td>DOB: 01/18/35</td>
         </tr>
         <tr>
            <td>APGUI, JORGE</td>
            <td>DOB: 12/05/34</td>
         </tr>
         <tr>
            <td>APDACA, CODY</td>
            <td>DOB: 02/01/33</td>
         </tr>
         <tr>
            <td>ARLLO, MARIO</td>
            <td>DOB: 04/03/30</td>
         </tr>
         <tr>
            <td>AR, CHANELLE</td>
            <td>DOB: 06/07/39</td>
         </tr>
         <tr>
            <td>AR AGA, ADAN</td>
            <td>DOB: 08/30/32</td>
         </tr>
         <tr>
            <td>ATC, MICHAEL</td>
            <td>DOB: 05/01/37</td>
         </tr>
      </table>
      <table id="2">
         <tr>
            <td colspan="2" align="center">
               <h2>As of April 17, 2014</h2>
            </td>
         </tr>
         <tr>
            <td>BAI Y, JAMES</td>
            <td>DOB: 03/05/35</td>
         </tr>
         <tr>
            <td>BAKER, ALECD</td>
            <td>DOB: 02/02/31</td>
         </tr>
         <tr>
            <td>BALDWIN , PH</td>
            <td>DOB: 08/08/39</td>
         </tr>
         <tr>
            <td>BALLWEBE RRY</td>
            <td>DOB: 04/06/34</td>
         </tr>
         <tr>
            <td>BANDLE, T X2</td>
            <td>DOB: 02/09/30</td>
         </tr>
      </table>
   </body>
</html>

截至2014年4月17日
亚当斯,马丁多布:11/02/38
亚当斯,伊利诺伊州:04/06/37
阿莱尼兹,阿列克斯多布:08/09/37
阿尔福德·贾森多布:8/11/35
快板:09/01/38
阿尔默,桑德多布:01/09/33
阿尔瓦雷赫克托布:07/04/30
阿马尔,图马多布:07/09/32
阿农,贾斯丁德:05/06/37
安森,特雷多布:01/18/35
阿普圭,约尔格多布:12/05/34
阿普达卡,CODYDOB:02/01/33
马里奥多布阿洛:04/03/30
夏奈尔阿肯色州,多布:06/07/39
阿尔阿加,阿丹多布:08/30/32
空中交通管制,MICHAELDOB:05/01/37
巴伊,詹姆斯多布:03/05/35
贝克,阿勒克多布:02/02/31
鲍德温,PHDOB:08/08/39
BALLWEBE RRYDOB:04/06/34
带,T X2DOB:02/09/30
XSLT1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:variable name="title" select="/Data/Head/Title"/>

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

    <xsl:template match="Person[position() mod 16 = 1]">
        <table id="{count(preceding-sibling::Person[position() mod 16 = 1])+1}">
            <tr>
                <td colspan="2" align="center">
                    <h2>
                        <xsl:value-of select="$title"/>
                    </h2>
                </td>
            </tr>
            <xsl:apply-templates select=".|following-sibling::Person[not(position() > 15)]" mode="row"/>
        </table>
    </xsl:template>

    <xsl:template match="Person" mode="row">
        <tr>
            <td>
                <xsl:value-of select="Name"/>
            </td>
            <td>
                <xsl:value-of select="DOB"/>
            </td>
        </tr>
    </xsl:template>

    <xsl:template match="text()"/>

</xsl:stylesheet>

输出

<Data>
    <Head><Title>As of April 17, 2014</Title></Head>
    <Person><Name>ADAMS,MARTIN</Name><DOB>DOB: 11/02/38</DOB></Person>
    <Person><Name>ADAMS,ICHAEL</Name><DOB>DOB: 04/06/37</DOB></Person>
    <Person><Name>ALANIZ, ALEX</Name><DOB>DOB: 08/09/37</DOB></Person>
    <Person><Name>ALFORD JASON</Name><DOB>DOB: 08/11/35</DOB></Person>
    <Person><Name>ALLEGR ERICK</Name><DOB>DOB: 09/01/38</DOB></Person>
    <Person><Name>ALMER,XANDER</Name><DOB>DOB: 01/09/33</DOB></Person>
    <Person><Name>ALVAREHECTOR</Name><DOB>DOB: 07/04/30</DOB></Person>
    <Person><Name>AMAR,  TUMAA</Name><DOB>DOB: 07/09/32</DOB></Person>
    <Person><Name>ANON, JUSTIN</Name><DOB>DOB: 05/06/37</DOB></Person>
    <Person><Name>ANSON, TERRY</Name><DOB>DOB: 01/18/35</DOB></Person>
    <Person><Name>APGUI, JORGE</Name><DOB>DOB: 12/05/34</DOB></Person>
    <Person><Name>APDACA, CODY</Name><DOB>DOB: 02/01/33</DOB></Person>
    <Person><Name>ARLLO, MARIO</Name><DOB>DOB: 04/03/30</DOB></Person>
    <Person><Name>AR, CHANELLE</Name><DOB>DOB: 06/07/39</DOB></Person>
    <Person><Name>AR AGA, ADAN</Name><DOB>DOB: 08/30/32</DOB></Person>
    <Person><Name>ATC, MICHAEL</Name><DOB>DOB: 05/01/37</DOB></Person>
    <Person><Name>BAI Y, JAMES</Name><DOB>DOB: 03/05/35</DOB></Person>
    <Person><Name>BAKER, ALECD</Name><DOB>DOB: 02/02/31</DOB></Person>
    <Person><Name>BALDWIN , PH</Name><DOB>DOB: 08/08/39</DOB></Person>
    <Person><Name>BALLWEBE RRY</Name><DOB>DOB: 04/06/34</DOB></Person>
    <Person><Name>BANDLE, T X2</Name><DOB>DOB: 02/09/30</DOB></Person>
</Data>
<html>
   <body>
      <table id="1">
         <tr>
            <td colspan="2" align="center">
               <h2>As of April 17, 2014</h2>
            </td>
         </tr>
         <tr>
            <td>ADAMS,MARTIN</td>
            <td>DOB: 11/02/38</td>
         </tr>
         <tr>
            <td>ADAMS,ICHAEL</td>
            <td>DOB: 04/06/37</td>
         </tr>
         <tr>
            <td>ALANIZ, ALEX</td>
            <td>DOB: 08/09/37</td>
         </tr>
         <tr>
            <td>ALFORD JASON</td>
            <td>DOB: 08/11/35</td>
         </tr>
         <tr>
            <td>ALLEGR ERICK</td>
            <td>DOB: 09/01/38</td>
         </tr>
         <tr>
            <td>ALMER,XANDER</td>
            <td>DOB: 01/09/33</td>
         </tr>
         <tr>
            <td>ALVAREHECTOR</td>
            <td>DOB: 07/04/30</td>
         </tr>
         <tr>
            <td>AMAR,  TUMAA</td>
            <td>DOB: 07/09/32</td>
         </tr>
         <tr>
            <td>ANON, JUSTIN</td>
            <td>DOB: 05/06/37</td>
         </tr>
         <tr>
            <td>ANSON, TERRY</td>
            <td>DOB: 01/18/35</td>
         </tr>
         <tr>
            <td>APGUI, JORGE</td>
            <td>DOB: 12/05/34</td>
         </tr>
         <tr>
            <td>APDACA, CODY</td>
            <td>DOB: 02/01/33</td>
         </tr>
         <tr>
            <td>ARLLO, MARIO</td>
            <td>DOB: 04/03/30</td>
         </tr>
         <tr>
            <td>AR, CHANELLE</td>
            <td>DOB: 06/07/39</td>
         </tr>
         <tr>
            <td>AR AGA, ADAN</td>
            <td>DOB: 08/30/32</td>
         </tr>
         <tr>
            <td>ATC, MICHAEL</td>
            <td>DOB: 05/01/37</td>
         </tr>
      </table>
      <table id="2">
         <tr>
            <td colspan="2" align="center">
               <h2>As of April 17, 2014</h2>
            </td>
         </tr>
         <tr>
            <td>BAI Y, JAMES</td>
            <td>DOB: 03/05/35</td>
         </tr>
         <tr>
            <td>BAKER, ALECD</td>
            <td>DOB: 02/02/31</td>
         </tr>
         <tr>
            <td>BALDWIN , PH</td>
            <td>DOB: 08/08/39</td>
         </tr>
         <tr>
            <td>BALLWEBE RRY</td>
            <td>DOB: 04/06/34</td>
         </tr>
         <tr>
            <td>BANDLE, T X2</td>
            <td>DOB: 02/09/30</td>
         </tr>
      </table>
   </body>
</html>

截至2014年4月17日
亚当斯,马丁
出生日期:11/02/38
亚当斯,伊凯尔
DOB:04/06/37
阿莱尼兹,亚历克斯
出生日期:08/09/37
阿尔福德·杰森
出生日期:8/11/35
埃里克快板
日期:09/01/38
阿尔默,桑德
日期:01/09/33
阿尔瓦雷克托
日期:07/04/30
阿马尔,图马
DOB:07/09/32
安侬,贾斯汀
DOB:05/06/37
安森,特里
日期:01/18/35
阿普圭,豪尔赫
出生日期:12/05/34
阿普达卡,科迪
日期:02/01/33
阿洛,马里奥
日期:04/03/30
夏奈尔
日期:06/07/39
阿甘,阿丹
日期:2013年8月30日
空中交通管制,迈克尔
出生日期:05/01/37
截至2014年4月17日
巴伊,詹姆斯
出生日期:35年5月3日
贝克,阿列克德
日期:02/02/31
鲍德温博士
出生日期:08/08/39
鲍尔韦伯酒店
日期:04/06/34
班德尔