2010-07-26 2 views
1

это пример моего входного файла.Можно установить приоритет на «group-start-with» -clause?

<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" или элемент "КТС"
  • состояние B: если "ссс" немедленно следующее за "БББ" взять их вместе

Это 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» «группу» -Element.

<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-start-with» и дать ему более высокий приоритет, чем условие A? Я кое-что о том, что вы можете дать паттерны приоритет читать ...

ТНХ заранее cpt.oneeye

ответ

2

Сохраняя свой стиль таблицы стилей, таблица стилей:

<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). Однако форматирование было настолько плохим, что я отредактировал ваш ответ. Пожалуйста, никогда не пишите: '

+0

привет аледжандро, спасибо (снова) за решение. –

+0

@Dimitre: Спасибо за редактирование. Я только изменил шаблон для группировки. Я должен был уделить внимание этим пустым инструкциям. – 2010-07-27 12:41:52