仅使用XSL将XML数据返回到下一个h2

仅使用XSL将XML数据返回到下一个h2,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我想知道如何只将XML数据的一部分返回到下一个h2标记。因此,我有一个名为SUMMARY的xml节点,如下所示,其中包含一些示例文本: <SUMMARY> <h2>heading One</h2><p>paragraph text under heading one</p> <h2>Heading Two</h2><p>paragraph text under heading two<

我想知道如何只将XML数据的一部分返回到下一个h2标记。因此,我有一个名为SUMMARY的xml节点,如下所示,其中包含一些示例文本:

 <SUMMARY>
  <h2>heading One</h2><p>paragraph text under heading one</p>
  <h2>Heading Two</h2><p>paragraph text under heading two</p>
  <h2>Heading Three</h2><p>paragraph text under heading three</p>       
 </SUMMARY>

标题1标题1下的段落文本

标题2标题2下的段落文本

标题三标题三下的段落文本
我目前正在使用这个,但它不是很有效

         <xsl:choose>
          <xsl:when test="contains(SUMMARY, ':')">
            <xsl:value-of select="substring-before(SUMMARY, '.')"/>.
            </xsl:when>
          </xsl:choose>

.
任何帮助都将不胜感激

共有6个标题,下面有文本。我只想退回第二个<代码>标题二:标题二下的段落文本是预期结果

要返回第二个标题和第二段的副本,只需执行以下操作:

<xsl:template match="SUMMARY">
    <xsl:copy-of select="h2[2] | p[2]"/>
</xsl:template>


重要
我注意到您已经从给定的示例中删除了CDATA标记。我觉得这很令人困惑

如果CDATA部分不存在,那么这是一个非常小的问题(从上面的解决方案可以看出)。事实上,这是你的问题开始,我不会费心回答它


OTOH,如果CDATA标记仍然存在,并且您选择删除它以“简化”您的问题,那么上述解决方案将不起作用,任务将变得更加困难

在XSLT1.0中,为了检索属于特定里程碑的内容(在本例中是标题元素),我建议使用以下两种方法之一。将这些示例中的
部分替换为您希望对检索到的内容执行的任何操作

1.使用按键:

2.迭代标题的以下同级:


您的问题不清楚。“直到下一个h2标记为止只有一部分XML数据”到底意味着什么请注意,在给定的XML中没有
h2
标记;CDATA部分中的所有内容都只是一个字符串,没有任何标记。XML节点“SUMMARY”有一组数据,这些数据由h2标题分隔,每个标题下面都有文本段落。共有6个标题,下面有文本。我只想退第二个。这还不清楚吗?如果你公布了预期的结果,就会清楚得多。并告诉我们您将使用哪个XSLT处理器。标题二:标题二下的段落文本是预期结果。我使用的是一个内容管理系统,所以我不确定它使用的是哪个处理器——我使用的是一个连接到xsl文件的xml数据源。下面是如何找到的:CMS允许我输入一个逗号分隔的标记名列表,您希望将其包含在[CDATA]中。但我删除了CDATA作为更正。太好了!谢谢Thomas-很长时间没有使用xsl了,因此我需要帮助解决像这样更复杂的问题。
<xsl:key name="content-by-heading" match="SUMMARY/p" 
  use="generate-id(preceding-sibling::*[self::h1|self::h2|self::h3|self::h4|self::h5|self::h6][1])"/>

<xsl:template match="h2">
  <xsl:copy-of select="key('content-by-heading', generate-id())"/>
</xsl:template>
<xsl:template match="h2">
  <xsl:apply-templates select="following-sibling::*[1]" mode="get-heading-content"/>
</xsl:template>

<xsl:template match="*" mode="get-heading-content">
  <xsl:copy-of select="."/>
  <xsl:apply-templates select="following-sibling::*[1]" mode="get-heading-content"/>
</xsl:template>

<!-- Stop iteration when we're at the next heading -->
<xsl:template match="h1|h2|h3|h4|h5|h6" mode="get-heading-content"/>