【问题标题】:XSLT - analyzing following-siblingsXSLT - 分析以下兄弟姐妹
【发布时间】: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 只有一个&lt;section&gt;&lt;p&gt; 节点。和&lt;p&gt; 节点具有不同的属性'main''para1''para2' 我需要的是通过分析&lt;p&gt; 节点分隔到&lt;p&gt; 节点到&lt;section&gt; 开始&lt;p&gt; 的新属性。并将'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) 新的&lt;section&gt; 作为chid 添加到现有的&lt;section&gt; 节点。但我需要它作为现有&lt;section&gt; 的后续兄弟(如预期输出所示。)

2) &lt;p id="main-para1"&gt;&lt;p id="main-para1"&gt; 的以下兄弟姐妹不会复制到 &lt;section&gt;

谁能建议我如何修改我的代码以获得预期的输出?

提前致谢!

【问题讨论】:

  • 这是不可能的。请在您的段落中添加一些识别内容(例如&lt;p id="main"&gt;a&lt;/p&gt;&lt;p id="main"&gt;b&lt;/p&gt; 等),以便我们了解结果与来源的关系。
  • @michael.hor257k ,感谢您的评论。编辑了问题并添加了一些内容。
  • 我相信你这里有一个错误:&lt;p id="para 1 main1"&gt;。或者我真的不明白。
  • @michael.hor257k ,是的,当我添加内容时,我犯了那个错误。我已更正并更新了问题

标签: xml xslt xslt-2.0


【解决方案1】:

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

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>

【讨论】:

  • 感谢您的回答。这真的很有帮助。 :) 但是在我的 xml 中存在更多组。作为示例而不是

    如果我们有

    "group-starting-with="p[starts-with(@id, 'para')]" 应该如何改变组内容并获得所需的输出?我已经根据这种情况修改了原始问题。

  • @sanjay 很难说不知道所有组的共同点。也许[not(@id='main')] 会起作用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 2019-05-06
  • 2023-03-22
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多