Класс Activator выполняет это задание в .net, и этот метод очень полезен для сценариев зависимостей инъекций.
string NameSpace = "ProjectName.YourNameSpace";
string ProbeClass = "CLassName";
ObjectHandle ProberHandle = Activator.CreateInstance(NameSpace, ProbeClass) as ObjectHandle;
ClassName Prober = ProberHandle.Unwrap() as ClassName;
Убедитесь, что вы развернете перед типом каста, иначе он даст ошибку преобразования.
Сохраняя стиль вашей таблицы стилей, эта таблица стилей:
<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>