XSLT - 分析兄弟姐妹

时间:2015-09-18 11:05:55

标签: xml xslt xslt-2.0

我有一个xml如下,

<doc>
    <section>
        <p id="main">main 1</p>
        <p id="main">main 2</p>
        <p id="para1">para1 1</p>
        <p id="main">
            <p>para1 sub1</p>
            <p>para1 sub2</p>
        </p>
        <p id="main">para1 main2</p>
        <p id="main">para1 main3</p>
        <p id="chapter1">
            <p>para2 sub1</p>
            <p>para2 sub2</p>
          </p>
        <p id="main">para2 main1</p>
        <p id="main">para2 main2</p>
        <p id="main">para2 main3</p>
        <p id="para1">para1 1</p>
        <p id="main">
            <p>para 1 sub3</p>
            <p> para1 sub4</p>
          </p>
        <p id="main">para1 main2</p>
    </section>
</doc>

如您所见,XML只有一个<section><p>个节点。和<p>节点具有不同的属性'main''para1''para2'我需要的是通过分析<p>节点分隔到<p>节点到{{ 1}}它开始<section>的新属性。并将<p>'para1'属性更改为'para2''main-para1'所以我的预期输出是,

'main-para2'

我写完以完成任务的xsl是

<doc>
    <section>
        <p id="main">main 1</p>
        <p id="main">main 2</p>
    </section>
    <section>
        <p id="main-para1">para1 1</p>
        <p id="main">
            <p>para1 sub1</p>
            <p>para1 sub2</p>
        </p>
        <p id="main">para1 main2</p>
        <p id="main">para1 main3</p>
    </section>
    <section>
        <p id="main-chapter1">
            <p>para2 sub1</p>
            <p>para2 sub2</p>
        </p>
        <p id="main">para2 main1</p>
        <p id="main">para2 main2</p>
        <p id="main">para2 main3</p>
     </section>
    <section>
        <p id="main-para1">para1 1</p>
        <p id="main">
            <p>para 1 sub3</p>
            <p>para 1 sub4</p>
        </p>
        <p id="main">para1 main2</p>
    </section>
</doc>

但是,我在上面的XSL代码中无法解决几个问题,

1)将新 <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="p[preceding-sibling::p[@id='para1']][following-sibling::p[@id='para2']]"/> <xsl:template match="p[preceding-sibling::p[@id='para2']][following-sibling::p[@id='para1']]"/> <xsl:template match="p[@id='para1']"> <section> <p id="main-para1"> <xsl:apply-templates/> </p> </section> </xsl:template> <xsl:template match="p[@id='para2']"> <section> <p id="main-para2"> <xsl:apply-templates/> </p> </section> </xsl:template> 作为chid添加到现有<section>节点。但是我需要它作为跟随现有<section>的兄弟(如预期输出中所示)。

2)<section><p id="main-para1">的以下兄弟姐妹未被复制到<p id="main-para1">

任何人都可以建议我如何修改我的代码以获得预期的输出?

先谢谢!

1 个答案:

答案 0 :(得分:2)

我相信这会返回预期结果:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="section">
    <xsl:for-each-group select="p" group-starting-with="p[starts-with(@id, 'para')]">
        <section>
            <xsl:apply-templates select="current-group()"/>
        </section>      
    </xsl:for-each-group>
</xsl:template>

<xsl:template match="p/@id[starts-with(., 'para')]">
    <xsl:attribute name="id" select="concat('main-', .)"/>
</xsl:template>

</xsl:stylesheet>