标记的 XSL 分组和包装
Posted
技术标签:
【中文标题】标记的 XSL 分组和包装【英文标题】:XSL grouping and wrapping of tags 【发布时间】:2021-05-18 10:31:59 【问题描述】:在一个 xsl 转换方面需要一些帮助。 我得到了一个格式如下的 XML
<p class="list">
<a href="../link-1.mp4">First Vid </a>
</p>
<p class="indent">test</p>
<notes><p>TEST ME NOTE</p></notes>
<p class="list">
<a href="../link-2.mp4">Second Vid </a>
</p>
这需要转换成类似的东西
<ul>
<li class="list">
<p>
<a href="../link-1.mp4">First Vid </a>
</p>
<p class="indent">test</p>
<notes>
<p>TEST ME NOTE</p>
</notes>
</li>
<li class="list">
<a href="../link-2.mp4">Second Vid </a>
</li>
</ul>
我做的是
<xsl:template match="p">
<li class="list">
<p>
<xsl:apply-templates/>
</p>
</li>
</xsl:template>
但这为所有 p 元素创建了 li 并且我丢失了 notes 标签。 如何将类列表之间的这些节点包装到第一个 li?
【问题讨论】:
您是否阅读过***.com/tags/xslt-grouping/info 并尝试过其中的一种方法(例如group-starting-with="p[@class = 'list']"
)?
【参考方案1】:
您可以使用 group-starting-with,例如:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<output>
<ul>
<xsl:for-each-group select="input/*" group-starting-with="p[@class='list']">
<li class="list">
<xsl:copy-of select="current-group()"/>
</li>
</xsl:for-each-group>
</ul>
</output>
</xsl:template>
</xsl:stylesheet>
在这里查看它的工作原理:https://xsltfiddle.liberty-development.net/aiyneL
【讨论】:
工作得非常好。非常感谢 @JinoJohnDevasia 不客气。如果您的问题得到解答,请将答案标记为已接受。以上是关于标记的 XSL 分组和包装的主要内容,如果未能解决你的问题,请参考以下文章