如何使用xslt将大量孤立标记放入其他标记中

如何使用xslt将大量孤立标记放入其他标记中,xslt,Xslt,我有一些成串的标签,没有放在任何标签上。 但我需要把它放在标签里,直到下一个序列标签出现 我也尝试过同样的方法,但是每个孤立标签都会被放置在不同的部分,这并不像预期的那样 输入Xml: <title>Info111</title> <ul> underline<ul> <li>list</li> <serial> <em>this is for em</em> <ti

我有一些成串的标签,没有放在任何标签上。 但我需要把它放在标签里,直到下一个序列标签出现

我也尝试过同样的方法,但是每个孤立标签都会被放置在不同的部分,这并不像预期的那样

输入Xml:

<title>Info111</title>
<ul> underline<ul>
<li>list</li>
<serial>
    <em>this is for em</em>
    <title>serial title</title>
</serial>
<title>Info2222</title>
<ul> underline2222<ul>
<li>li for list</li>
Info111
    下划线
    • 名单
    • 这是给他们的 连载标题 资讯2222
        下划线222
        • 李为名单
我的xslt代码:

<xsl:variable name='list' select='//serial'/>

<xsl:template match='/'>

        <xsl:for-each select='$list'>
            <xsl:element name='serial'>
                <xsl:apply-templates select='*[not(name(.)="serial")]'/>

            </xsl:element>
        </xsl:for-each>

</xsl:template>

实际产量

:
<serial>
<title>Info111</title>
</serial>
<serial>
     <ul> underline<ul>
</serial>
<serial>
      <li>list</li>
</serial>
<serial>
    <em>this is for em</em>
    <title>serial title</title>
</serial>
<serial>
    <title>Info2222</title>
</serial>
<serial>
    <ul> underline2222<ul>
</serial>
<serial>
<li>li for list</li>
</serial>
:
信息111
    下划线
    • 名单
    • 这是给他们的 连载标题 资讯2222
        下划线222
        • 李为名单
预期产出:

<serial>
     <title>Info111</title>
     <ul> underline<ul>
     <li>list</li>
</serial>

<serial>
    <em>this is for em</em>
    <title>serial title</title>
</serial>

<serial>
    <title>Info2222</title>
    <ul> underline2222<ul>
    <li>li for list</li>
</serial>

信息111
    下划线
    • 名单
    • 这是给他们的 连载标题 资讯2222
        下划线222
        • 李为名单

请帮我解决这个问题

如果你使用正确的术语,对每个人都有帮助。我认为“标签”的意思可能是“元素”。(图元实际上有两个标记,一个开始标记和一个结束标记)。起初我不知道你所说的“束”是什么意思,但通过研究你的例子,我认为你指的是“组”

您显示的输入不是完整的文档。在格式良好的XML中,始终存在根元素。所以我不知道“孤立标记”是什么意思——格式良好的XML中的每个元素都有一个父节点

当我们讨论您的问题时,如果您在问题上添加“XSLT 1.0”或“XSLT 2.0”或“XSLT 3.0”标记(“StackOverflow意义上的标记”,而不是XML意义上的标记”),这将帮助每个人解决XSLT问题,因为这通常会影响答案

显示的XSLT代码仅处理$list中的元素,即名为“serial”的元素。所以我不知道如何得到包含例如Info111和Info222的输出

这方面的XSLT 2.0代码是:

<xsl:for-each-group select="*" group-adjacent="boolean(self::serial)">
  <xsl:choose>
    <xsl:when test="self::serial">
      <xsl:copy-of select="current-group()"/>
    </xsl:when>
    <xsl:otherwise>
      <serial><xsl:copy-of select="current-group()"/></serial>
    </xsl:otherwise>
  </xsl:choose>
</xsl:for-each-group>

谢谢您的回复!
现在,它可以很好地使用下面的代码

<xsl:template match="content/body">
    <xsl:for-each-group select="*" group-adjacent="boolean(self::serial)">
  <xsl:choose>
    <xsl:when test="self::serial">
      <xsl:copy-of select="current-group()"/>
    </xsl:when>
    <xsl:otherwise>
      <serial><xsl:copy-of select="current-group()"/></serial>
    </xsl:otherwise>
  </xsl:choose>
</xsl:for-each-group>
    </xsl:template>


我得到了预期的结果:)

您可以使用哪个XSLT版本?XSLT 2.0版本请帮助我解决这个问题,谢谢您的回复!是的,您是对的,每个标记都有xml中的父标记,但这里的孤立标记是指不在序列标记下的标记。我的xml是:Info111
    underline
    • 列表
    • 这是用于em序列标题Info2222
        underline2222
        • 列表
        • 当我尝试您的解决方案时。我得到以下错误:样式表中的这个位置不允许使用xsl:for-each-group!我的输出与输入xml相同。未反映任何更改
          xsl:对于每个组
          都是一条指令,它需要进入模板规则中。