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

时间:2017-08-03 00:12:57

标签: 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</p>
  <h2>Heading Three</h2><p>paragraph text under heading three</p>       
 </SUMMARY>

我目前正在使用它,但它不能正常工作

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

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:2)

在XSLT 1.0中,为了检索属于特定里程碑的内容(在本例中为标题元素),我建议使用以下两种方法之一。将这些示例中的<xsl:copy-of>部分替换为您要对检索到的内容执行的任何操作。

1。使用键:

<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>

2。迭代标题的以下兄弟:

<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"/>

答案 1 :(得分:0)

  

下面总共有6个带有文字的标题。我只想回到第二个。 ... <h2>Heading Two:</h2><p>paragraph text under heading two</p>是预期的结果。

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

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

重要
我注意到您已从给定示例中删除了CDATA标记。我觉得这很混乱。

如果没有CDATA部分,那么这是一个非常微不足道的问题(从上面的解决方案可以看出)。事实上,这是你的问题,我根本不打算回答它。

OTOH,如果CDATA标记毕竟存在,并且您已选择将其删除以简化&#34;简化&#34;你的问题,然后上面的解决方案不会工作,任务变得太多更难。