【发布时间】:2015-09-18 11:05:55
【问题描述】:
我有一个如下的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> 节点到<section> 开始<p> 的新属性。并将'para1' 和'para2' 属性更改为'main-para1' 和'main-para2' 所以我的预期输出是,
<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 如下
<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>
但是我有几个问题在上面的 XSL 代码中无法解决,
1) 新的<section> 作为chid 添加到现有的<section> 节点。但我需要它作为现有<section> 的后续兄弟(如预期输出所示。)
2) <p id="main-para1"> 和 <p id="main-para1"> 的以下兄弟姐妹不会复制到 <section>
谁能建议我如何修改我的代码以获得预期的输出?
提前致谢!
【问题讨论】:
-
这是不可能的。请在您的段落中添加一些识别内容(例如
<p id="main">a</p>、<p id="main">b</p>等),以便我们了解结果与来源的关系。 -
@michael.hor257k ,感谢您的评论。编辑了问题并添加了一些内容。
-
我相信你这里有一个错误:
<p id="para 1 main1">。或者我真的不明白。 -
@michael.hor257k ,是的,当我添加内容时,我犯了那个错误。我已更正并更新了问题