我有一个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">
任何人都可以建议我如何修改我的代码以获得预期的输出?
先谢谢!
答案 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>