không chắc chắn nếu điều này là có thể mà không phải trải qua nhiều lần, nhưng tôi sẽ hỏi (XSL của tôi hơi bị gỉ)xslt để bỏ qua các nút "đã truy cập"
Tôi có tài liệu XML chứa các nút như sau: (! các tập tin thực chứa rất nhiều thẻ cấu trúc mà phụ thuộc lẫn nhau, không ai trong số đó là hình tròn)
<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>
Những gì tôi muốn làm là để tạo ra một số văn bản (trong trường hợp này C++ struct
s) và yêu cầu hiển nhiên là thứ tự o f các struct
s, vì vậy sản lượng lý tưởng của tôi sẽ là
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;
};
Tôi biết tôi có thể sử dụng tờ khai phía trước và điều đó có nghĩa rằng thứ tự không quan trọng, tuy nhiên vấn đề là sẽ có "xử lý" mã inline trong các cấu trúc, và chúng sẽ yêu cầu có định nghĩa thực sự.
Cho đến nay tôi có thể phát hiện để xem nếu một structure
có bất kỳ phụ thuộc, với các bit sau 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>
(điều này xảy ra bên trong một <xsl:template match="structure">
)
Bây giờ, về mặt lý thuyết, tôi có thể sau đó hãy làm theo chuỗi "phụ thuộc" này và tạo ra struct
s cho mỗi mục nhập trước tiên, sau đó bạn có thể tưởng tượng, điều này tạo ra nhiều bản sao của cùng một cấu trúc - đó là một nỗi đau ..
Có cách nào để tránh các bản sao? Về cơ bản, khi một cấu trúc đã được truy cập, và nếu chúng ta ghé thăm lần nữa, đừng bận tâm xuất mã cho nó ... Tôi không cần xslt đầy đủ để làm điều này (trừ khi nó tầm thường!), Nhưng chỉ bất kỳ ý tưởng nào về cách tiếp cận ...
Nếu không có, tôi có thể về mặt lý thuyết quấn struct
với một người bảo vệ #ifdef
/#define
/#endif
để trình biên dịch chỉ sử dụng định nghĩa đầu tiên, tuy nhiên điều này là thực sự khó chịu! :(
(GHI CHÚ: XSLT 1.0, xsltproc trên linux: Sử dụng libxml 20.623, libxslt 10115 và libexslt 812)
xuất sắc câu hỏi, 1. Xem câu trả lời của tôi cho một giải pháp hoàn chỉnh và ngắn. :) –