使用xml的属性生成动态html表格
我相信我有一个非常有趣的问题需要解决。我有一个类似这样的 XML:
<elements>
<element name="nam1" val="John" xpos="10" ypos="10" />
<element name="nam3" val="Mark" xpos="10" ypos="30" />
<element name="nam4" val="Rick" xpos="50" ypos="30" />
<element name="nam5" val="Jeff" xpos="10" ypos="50" />
<element name="nam6" val="Dean" xpos="50" ypos="50" />
<element name="nam2" val="Scott" xpos="50" ypos="10" />
xml 中元素的位置可能不是连续的。
我必须将其转换为 HTML 表格。 TR 和 TD 的内容需要根据 XML 的 xpos 和 ypos 属性“动态”设置。输出应该是这样的:
<table>
<tr>
<td>John</td><td>Scott</td>
</tr>
<tr>
<td>Mark</td><td>Rick</td>
</tr>
<tr>
<td>Jeff</td><td>Dean</td>
</tr>
</table>
当 xpos 或 ypos 不完全相同但略有不同时,事情会变得更加复杂。 2 个相邻元素.. 例如,
<elements>
<element name="nam1" val="John" xpos="10" ypos="12" />
<element name="nam3" val="Mark" xpos="11" ypos="30" />
<element name="nam4" val="Rick" xpos="53" ypos="32" />
<element name="nam5" val="Jeff" xpos="09" ypos="52" />
<element name="nam6" val="Dean" xpos="51" ypos="51" />
<element name="nam2" val="Scott" xpos="50" ypos="10" />
</elements>
我有什么想法可以实现这一目标吗?使用 xslt 或 Java/Javascript dom 解析器?或者其他什么?又如何?
I believe I have a very interesting problem to solve. I've a XML something like this :
<elements>
<element name="nam1" val="John" xpos="10" ypos="10" />
<element name="nam3" val="Mark" xpos="10" ypos="30" />
<element name="nam4" val="Rick" xpos="50" ypos="30" />
<element name="nam5" val="Jeff" xpos="10" ypos="50" />
<element name="nam6" val="Dean" xpos="50" ypos="50" />
<element name="nam2" val="Scott" xpos="50" ypos="10" />
The positions of the elements in the xml may not be sequential.
I've to convert this into a HTML table. The contents of the TRs and TDs need to be "dynamically" set based on xpos and ypos attributes of the XML .. output should be something like this :
<table>
<tr>
<td>John</td><td>Scott</td>
</tr>
<tr>
<td>Mark</td><td>Rick</td>
</tr>
<tr>
<td>Jeff</td><td>Dean</td>
</tr>
</table>
Things get more complicated when the xpos or ypos are not exactly same, but slightly different for 2 adjoining elements ..
e.g.
<elements>
<element name="nam1" val="John" xpos="10" ypos="12" />
<element name="nam3" val="Mark" xpos="11" ypos="30" />
<element name="nam4" val="Rick" xpos="53" ypos="32" />
<element name="nam5" val="Jeff" xpos="09" ypos="52" />
<element name="nam6" val="Dean" xpos="51" ypos="51" />
<element name="nam2" val="Scott" xpos="50" ypos="10" />
</elements>
Any ideas how do I achieve this ? using xslt or Java/Javascript dom parser ? or anything else ? and how ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我不敢尝试使用 XSLT 来解决这个问题 - XSLT 适合简单、基本的转换。虽然有可能成功,但在这个过程中可能会让你发疯。
至于完全解决它:
现在,我希望您会问“并且不进行排序?” (因为它太贵了,无论如何)。答案:您将以一种或另一种方式对数据进行排序。在内存中创建一个巨大的地图,并根据坐标向其中添加元素就是排序。这只是不明显的。
[编辑] 也许这个技巧也有效:使用
div
和position:absolute
代替表格,并缩放坐标直到文本不出现。重叠时间更长。这将模拟一个表格,但它是否适合您取决于坐标是否实际上意味着什么(即它们不是随机的,但其他一些系统使用它们来布局数据)I wouldn't dare to attempt to solve this with XSLT - XSLT is good for simple, basic transformations. While it might be possible to pull it off, it will probably drive you insane in the process.
As for solving it at all:
Now, I expect you to ask "and without sorting?" (because it's too expensive, whatever). Answer: You will sort the data, one way or another. Creating a huge map in memory and add elements to it based on the coordinate is sorting. It's just non-obvious.
[EDIT] Maybe this trick will also work: Instead of a table, use
div
withposition: absolute
and scale the coordinates until the texts no longer overlap. That will emulate a table but whether it works for you depends on whether the coordinates actually mean something (i.e. they aren't random but some other system uses them to lay out the data)最简单的方法是编写小的 java 代码来解析它并将其转换为所需的格式。
用xslt做起来非常复杂。
实际上,使用 xslt 来做这件事是一场噩梦,特别是如果您想稍后维护它并更改规则。
java代码将来会很容易理解和维护,但是会很长。
the easiest is to write small java code that parse it and translate it to the desired format.
It is very complicated to do it with xslt.
actually it is a nightmare to do it with xslt, specially if you want to maintain it later and change the rules.
java code will be easy to understand and maintainable for the future, but it is going to be long.