не уверен, что это возможно без необходимости проходить несколько проходов, но я все равно спрошу (мой XSL немного ржавый)
У меня есть XML-документ, который содержит следующие узлы:
<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>
(Реальный файл содержит множество структурных тегов с взаимозависимостями, ни один из которых не является круглым!)
Что я хочу сделать, это сгенерировать некоторый текст (в данном случае C ++ struct
s), и очевидным требованием является порядок struct
s, поэтому мой идеальный вывод будет
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;
};
Я знаю, что мог бы использовать предварительные объявления, и это означало бы, что порядок не имеет значения, однако проблема в том, что в структурах будет «обрабатываться» встроенный код, и им потребуется настоящее определение.
Пока я могу определить, есть ли у structure
какие-либо зависимости со следующим битом xsl:
<xsl:for-each select="descendant::*/@idref">
<xsl:variable name="name" select="."/>
<xsl:apply-templates select="//structure[@id = $name]" mode="struct.dep"/>
</xsl:for-each>
(это происходит внутри <xsl:template match="structure">
)
Теперь, теоретически, я мог бы затем следовать этой «цепочке» зависимостей и генерировать сначала struct
для каждой записи, затем ту, на которой я сейчас нахожусь, однако, как вы можете себе представить, это генерирует множество копий та же структура - это боль ..
Есть ли способ избежать копий? По сути, после того, как структура была посещена, и если мы посетим снова, чтобы не беспокоиться о выводе кода для нее ... Мне не нужен полный xslt, чтобы сделать это (если это не тривиально!), Но только любые идеи о подходах ...
Если нет, то теоретически я могу обернуть struct
защитой #ifdef
/ #define
/ #endif
, чтобы компилятор использовал только первое определение, однако это ДЕЙСТВИТЕЛЬНО ГРОМКО! (
(ПРИМЕЧАНИЯ: xslt 1.0, xsltproc в Linux: использование libxml 20623, libxslt 10115 и libexslt 812)