可以在“group-starting-with”条款上设置优先级?

问题描述:

这是我的输入文件的一个例子。可以在“group-starting-with”条款上设置优先级?

<root> 
    <!-- [...] --> 
    <bbb>Foo 1</bbb> 
    <aaa>xxxxxxxx</aaa> 
    <aaa>xxxxxxxx</aaa> 
    <aaa>xxxxxxxx</aaa> 
    <bbb>Foo 2</bbb> 
    <ccc>Foo 2.1</ccc> 
    <aaa>xxxxxxxx</aaa> 
    <aaa>xxxxxxxx</aaa> 
    <aaa>xxxxxxxx</aaa> 
    <bbb>Foo 3</bbb> 
    <ccc>Foo 3.1</ccc> 
    <aaa>xxxxxxxx</aaa> 
    <aaa>xxxxxxxx</aaa> 
    <aaa>xxxxxxxx</aaa> 
    <ccc>Foo 4</ccc> 
    <aaa>xxxxxxxx</aaa> 
    <aaa>xxxxxxxx</aaa> 
    <aaa>xxxxxxxx</aaa> 
</root> 

我想通过bbb和ccc元素对节点进行分组。在input-xml中也可能只有bbb或只有ccc。

有以下条件:

  • 条件A:由 “BBB” 或 “CCC” 元件
  • 条件B组:如果 “CCC” 是紧跟在 “BBB” 把它们一起

这是outpout的XML我想有:

<root> 
     <group> 
      <header>Foo 1</header> 
       <groupcontent> 
        <aaa>xxxxxxxx</aaa> 
        <aaa>xxxxxxxx</aaa> 
        <aaa>xxxxxxxx</aaa> 
       </groupcontent> 
     </group> 
     <group> 
      <header>Foo 2</header> 
      <subheader>Foo 2.1</subheader> 
      <groupcontent> 
       <aaa>xxxxxxxx</aaa> 
       <aaa>xxxxxxxx</aaa> 
       <aaa>xxxxxxxx</aaa> 
      </groupcontent> 
     </group> 
     <group> 
      <header>Foo 3</header> 
      <subheader>Foo 3.1</subheader> 
      <groupcontent> 
       <aaa>xxxxxxxx</aaa> 
       <aaa>xxxxxxxx</aaa> 
       <aaa>xxxxxxxx</aaa> 
      </groupcontent> 
     </group> 
     <group> 
      <subheader>Foo 4</subheader> 
      <groupcontent> 
       <aaa>xxxxxxxx</aaa> 
       <aaa>xxxxxxxx</aaa> 
       <aaa>xxxxxxxx</aaa> 
      </groupcontent> 
     </group> 
    </root> 

目前我哈遵循XSL。但问题在于,它产生了foreach“Foo”一个“组” - 元素。

<xsl:stylesheet> 

    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="/"> 
    <output> 
      <xsl:for-each-group select="root/*" group-starting-with="bbb|ccc"> 
       <group> 
         <xsl:apply-templates select="current-group()[self::bbb or self::ccc]"></xsl:apply-templates> 
         <groupcontent> 
          <xsl:apply-templates select="current-group()[not(self::bbb) and not (self::ccc)]"></xsl:apply-templates> 
         </groupcontent> 
       </group> 
      </xsl:for-each-group> 
     </output> 
    </xsl:template> 

    <xsl:template match="bbb"> 
     <header><xsl:value-of select="."></xsl:value-of></header> 
    </xsl:template> 

    <xsl:template match="ccc"> 
     <subheader><xsl:value-of select="."></xsl:value-of></subheader> 
    </xsl:template> 

    <xsl:template match="aaa"> 
     <p><xsl:value-of select="."></xsl:value-of></p> 
    </xsl:template> 

</xsl:stylesheet> 

如何将条件B添加到我的XSL中。是否有可能用一个foreach组解决这个问题?我是否可以将条件B添加到“group-starting-with”并赋予它高于条件A的优先级?我读过一些关于你能给模式的优先......

THX提前 cpt.oneeye

保留您的样式风格,这个样式表:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
<output> 
    <xsl:for-each-group select="root/*" group-starting-with= 
    "bbb|ccc[preceding-sibling::*[1][not(self::bbb)]]"> 
    <group> 
     <xsl:apply-templates select= 
     "current-group()[self::bbb or self::ccc]"/> 
     <groupcontent> 
     <xsl:apply-templates select= 
      "current-group()[not(self::bbb) and not (self::ccc)]"/> 
     </groupcontent> 
    </group> 
    </xsl:for-each-group> 
</output> 
</xsl:template> 
<xsl:template match="bbb"> 
<header> 
    <xsl:value-of select="."/> 
</header> 
</xsl:template> 
<xsl:template match="ccc"> 
<subheader> 
    <xsl:value-of select="."/> 
</subheader> 
</xsl:template> 
<xsl:template match="aaa"> 
<p> 
    <xsl:value-of select="."/> 
</p> 
</xsl:template> 

输出:

<output> 
    <group> 
     <header>Foo 1</header> 
     <groupcontent> 
      <p>xxxxxxxx</p> 
      <p>xxxxxxxx</p> 
      <p>xxxxxxxx</p> 
     </groupcontent> 
    </group> 
    <group> 
     <header>Foo 2</header> 
     <subheader>Foo 2.1</subheader> 
     <groupcontent> 
      <p>xxxxxxxx</p> 
      <p>xxxxxxxx</p> 
      <p>xxxxxxxx</p> 
     </groupcontent> 
    </group> 
    <group> 
     <header>Foo 3</header> 
     <subheader>Foo 3.1</subheader> 
     <groupcontent> 
      <p>xxxxxxxx</p> 
      <p>xxxxxxxx</p> 
      <p>xxxxxxxx</p> 
     </groupcontent> 
    </group> 
    <group> 
     <subheader>Foo 4</subheader> 
     <groupcontent> 
      <p>xxxxxxxx</p> 
      <p>xxxxxxxx</p> 
      <p>xxxxxxxx</p> 
     </groupcontent> 
    </group> 
</output> 
+1

伟大的解决方案(+1)。但是格式非常糟糕,我编辑了你的答案。请不要写:' xsl:value-of>或相同的wirth'','', ...等等。唯一的影响是代码变得非常难读,比它应该是两倍,并且需要水平滚动,没有正常的人会做... – 2010-07-27 04:57:42

+0

嗨亚历杭德罗,再次感谢您的解决方案。它工作正常 – 2010-07-27 11:58:39

+0

@Dimitre:感谢编辑,我只改变了分组的模式,我应该注意那些空的指令。 – 2010-07-27 12:41:52