我想知道如何只返回一部分 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>
任何帮助将不胜感激
在 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"/>
共有 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 标记,并且您选择删除它以"简化"您的问题,那么上述解决方案将不起作用,任务变得更加困难。