首页 > 解决方案 > 标记的 XSL 分组和包装

问题描述

在一个 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?

标签: xsltxslt-2.0xslt-grouping

解决方案


您可以使用 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


推荐阅读