это пример моего входного файла.Можно установить приоритет на «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
Отличное решение (+1). Однако форматирование было настолько плохим, что я отредактировал ваш ответ. Пожалуйста, никогда не пишите: '
привет аледжандро, спасибо (снова) за решение. –
@Dimitre: Спасибо за редактирование. Я только изменил шаблон для группировки. Я должен был уделить внимание этим пустым инструкциям. – 2010-07-27 12:41:52