emin değilim zaten "ziyaret" düğümleri atlamak için, ama yine isteyeceğizxslt bu birkaç geçiş gitmek zorunda kalmadan mümkün olup olmadığını
Ben bir XML belgesi var (benim XSL biraz paslanmış) hangi aşağıdaki gibi düğümleri içerir: (! gerçek dosya bağımlılıklar, hiçbiri dairesel olan yapı etiketleri bolca içerir)
<structures>
<structure id="STRUCT_A">
<field idref="STRUCT_B" name="b"/>
<field idref="STRUCT_C" name="c"/>
<field idref="FIELD_D" name="d"/>
</structure>
<structure id="STRUCT_B">
<field idref="STRUCT_C" name="c"/>
<field idref="FIELD_E" name="e"/>
</structure>
<structure id="STRUCT_C">
<field idref="FIELD_E" name="e"/>
<field idref="FIELD_F" name="f"/>
<field idref="FIELD_G" name="g"/>
</structure>
</structures>
ne yapmak istiyorum bu durumda C bazı metin (üretmektir ++ struct
s) ve açık gereklilik o sipariş struct
s f, bu nedenle benim ideal çıkış Ben bildirimleri ileri kullanabilirsiniz biliyor ve o sırası önemli olmadığı anlamına gelecektir
struct STRUCT_C
{
FIELD_E e;
FIELD_F f;
FIELD_G g;
};
struct STRUCT_B
{
STRUCT_C c;
FIELD_E e;
};
struct STRUCT_A
{
STRUCT_B b;
STRUCT_C c;
FIELD_D d;
};
olurdu, ancak sorun "işleme" kod satır içi olacağı ise yapılarda ve gerçek tanımın mevcut olmasını gerektirirler.
<xsl:for-each select="descendant::*/@idref">
<xsl:variable name="name" select="."/>
<xsl:apply-templates select="//structure[@id = $name]" mode="struct.dep"/>
</xsl:for-each>
Sonra olabilir, teorik olarak, Şimdi
(bu <xsl:template match="structure">
içeride olur): Şimdiye kadar ben structure
xsl aşağıdaki bit ile herhangi bir bağımlılık olup olmadığını görmek için algılayabilir
Bu bağımlılığı "zincir" izleyin ve her bir giriş için önce struct
s, sonra şu anda olduğum gibi, ancak hayal edebileceğiniz gibi, bu aynı yapının çok sayıda kopyasını üretir - bu bir acıdır ..
Kopyalardan kaçınmak için zaten var mı? Temel olarak, bir yapı ziyaret edildiğinde ve tekrar ziyaret edersek, kodun çıktısını almamaya özen göstermeliyiz ... Bunu yapmak için tam xslt'e ihtiyacım yok (önemsiz olmadıkça!), Fakat sadece yaklaşımlarla ilgili herhangi bir fikir ...
yoksa derleyici yalnızca ilk tanımını kullandığını, ancak bu gerçekten kötü olduğunu bu yüzden, ben teoride bir #ifdef
/#define
/#endif
görevlisi ile struct
sarabilirdiniz! :(
(NOTLAR: xslt 1.0, linux üzerinde Xsltproc: kullanma libxml 20623, Libxslt'nin 10115 ve libexslt 812)
Mükemmel bir soru, 1. Tam ve kısa bir çözüm için cevabımı görün. :) –