如何使用 XSLT 从平面 xml 文件创建 html 列表
我正在寻找一种干净的方法来使用 XSLT 执行以下操作。
转换此源:
<para>blah blah</para>
<list>num1</list>
<list>num2</list>
<list>num3</list>
<para>blah blah</para>
<list>num1</list>
<list>num2</list>
<para>blah blah blah blah blah</para>
到此输出:
<p>blah blah</p>
<ol>
<li>num1</li>
<li>num2</li>
<li>num3</li>
</ol>
<p>blah blah</p>
<ol>
<li>num1</li>
<li>num2</li>
</ol>
<p>blah blah blah blah blah</p>
请记住,我不知道到底有多少
。
到目前为止我有这个:
<xsl:template match="para">
<p><xsl:value-of select="." /></p>
</xsl:template>
<xsl:template match="list">
<ol><li><xsl:value-of select="." /></li></ol>
</xsl:template>
但我的输出看起来像这样:
<p>blah blah</p>
<ol><li>num1</li></ol>
<ol><li>num2</li></ol>
<ol><li>num3</li></ol>
<p>blah blah</p>
<ol><li>num1</li></ol>
<ol><li>num2</li></ol>
<p>blah blah blah blah blah</p>
我知道为什么我得到重复的
元素,但我不知道如何阻止它。真是一个脑筋急转弯。任何帮助将不胜感激。
I am looking for a clean way to do the following using XSLT.
Convert this source:
<para>blah blah</para>
<list>num1</list>
<list>num2</list>
<list>num3</list>
<para>blah blah</para>
<list>num1</list>
<list>num2</list>
<para>blah blah blah blah blah</para>
To this output:
<p>blah blah</p>
<ol>
<li>num1</li>
<li>num2</li>
<li>num3</li>
</ol>
<p>blah blah</p>
<ol>
<li>num1</li>
<li>num2</li>
</ol>
<p>blah blah blah blah blah</p>
Keep in mind I do not know exactly how many <list>
's there will be.
So far I have this:
<xsl:template match="para">
<p><xsl:value-of select="." /></p>
</xsl:template>
<xsl:template match="list">
<ol><li><xsl:value-of select="." /></li></ol>
</xsl:template>
But my output looks like this:
<p>blah blah</p>
<ol><li>num1</li></ol>
<ol><li>num2</li></ol>
<ol><li>num3</li></ol>
<p>blah blah</p>
<ol><li>num1</li></ol>
<ol><li>num2</li></ol>
<p>blah blah blah blah blah</p>
I know why I am getting duplicate <ol>
elements, but I do not know how to stop it. Quite a brain teaser.
Any help would be greatly appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
XSLT 2.0 有专门用于此类操作的工具:
使用此 XML:
您将获得所需的输出:
您应该在 http://www.w3.org/TR/xslt20/#xsl-for-each-group
XSLT 2.0 has tools especially for this kind of Operations:
With this XML:
You'll get the desired Output:
You should read up on for-each-group at http://www.w3.org/TR/xslt20/#xsl-for-each-group
此 XSLT 1.0 样式表:
输出:
注意: 细粒度遍历。
编辑:紧凑的代码。
This XSLT 1.0 stylesheet:
Output:
Note: Fine grained traversal.
Edit: Compact code.
此转换:
当应用于以下 XML 文档时(将提供的输入包装在单个顶部元素中):
产生所需的正确结果:
更新:OP在评论中表示,现在他想要一个解决方案,其中任何非
列表
元素都可以分隔一组相邻的列出
兄弟姐妹。这是更改后的问题的解决方案:
当此转换应用于以下 XML 文档时(请注意,分隔元素现在具有随机名称):
想要的,产生正确的结果:
This transformation:
when applied on the following XML document (wrapping the provided input in a single top element):
produces the wanted, correct result:
UPDATE: The OP has indicated in a comment that now he wants a solution where any non-
list
element can delimit a group of adjacentlist
siblings.Here is the solution to the changed question :
When this transformation is applied on the following XML document (Note that the separating elements have now random names):
the wanted, correct result is produced: