首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT -处理给定节点的以下兄弟节点

XSLT -处理给定节点的以下兄弟节点
EN

Stack Overflow用户
提问于 2015-09-14 10:02:13
回答 2查看 39关注 0票数 0

我有一个xml,如下所示

代码语言:javascript
复制
<doc>
    <h1>header 1</h1>
    <p>para 1</p>
    <p>para 2</p>

    <h1>header 2</h1>
    <p>para 3</p>
    <p>para 4</p>

    <h1>header 3</h1>
    <p>para 5</p>
    <p>para 6</p>
</doc>

我的要求是从<h1>创建无序列表,并将这些列表项链接到下面的<p>节点。

所以想要的输出应该是,

代码语言:javascript
复制
<doc>
    <div name="list">
        <ul>
            <li><a href="h1-1">header 1</a></li>
            <li><a href="h1-2">header 2</a></li>
            <li><a href="h1-3">header 3</a></li>
        </ul>
    </div>
    <div class="content">
        <div id="h1-1">
            <p>para 1</p>
            <p>para 2</p>
        </div>
        <div id="h1-2">
            <p>para 3</p>
            <p>para 4</p>
        </div>
        <div id="h1-3">
            <p>para 5</p>
            <p>para 6</p>
        </div>
    </div>
</doc>

为了完成这个任务,我编写了xsl,

代码语言:javascript
复制
       <doc>
            <div name="list">
                <ul>
                <xsl:for-each-group select="*" group-starting-with="h1">                    
                    <li><a href="h1-{count(preceding::h1)+1}"><xsl:apply-templates/></a></li>                   
                </xsl:for-each-group>
                </ul>
            </div>

            <div class="content">
                <xsl:for-each select="h1">
                    <div id="h1-{count(preceding::h1)+1}">
                        <!-- should copy follwing <p> nodes in <h1> -->
                    </div>
                </xsl:for-each>
            </div>
        </doc>

我无法解决的问题是如何复制<p>节点,这些节点作为以下兄弟节点放置到<h1>中,但在出现另一个<h1>之前。(举个例子可以给出一个清晰的概念。)

有人能给我一个解决办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-14 10:20:37

您的方法需要逆转:第一个div不需要分组,第二个需要分组。

没有必要考虑跟随(或前面)兄弟姐妹;只需将组缩小为p元素即可。

XSLT2.0

代码语言:javascript
复制
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" indent="yes"/>

<xsl:template match="doc">
    <doc>
        <div name="list">
            <ul>
                <xsl:for-each select="h1">
                    <li>
                        <a href="h1-{position()}">
                            <xsl:value-of select="."/>
                        </a>
                    </li>
                </xsl:for-each>
            </ul>
        </div>
        <div class="content">
            <xsl:for-each-group select="*" group-starting-with="h1">  
                <div id="h1-{position()}">
                    <xsl:copy-of select="current-group()[self::p]"/>
                </div>
            </xsl:for-each-group>                
        </div>
    </doc>
</xsl:template>

</xsl:stylesheet>
票数 2
EN

Stack Overflow用户

发布于 2015-09-14 10:08:01

您可能只是想看看您的源xml。如果段落只是该特定章节的一部分,那么它们很可能是标题的子节点。目前还没有确定正确段落的真正方法。

一旦你这样做了,解决方案应该简单得多。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32562026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档