标记的 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 分组和包装的主要内容,如果未能解决你的问题,请参考以下文章

如何实现 XSLT 标记化功能?

XSLT 将输出标记为数字

XML XSD XSL区别与联系

xml相关概念

如何使用打开和关闭标记包装所选文本?

如何标记和分组数组中的唯一功能