将XML转换为多个HTML表
我有一个需要转换为HTML的XML文件。它将被转换成多个表,每个表有16行,其中第一行XML数据将成为每个表的相同第一行。每个表将获得一个唯一的ID xml示例文件的结构如下(被截断-通常为几百行):将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
截至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
班德尔