2 xu của tôi trị giá trên một sự thay thế đơn giản (nhưng hiệu quả) (chỉ psuedocode cung cấp để minh hoạ tiến hành thận trọng :)
Outline của phương pháp này:. Một giải pháp thay thế có thể bao gồm một kịch bản wrapper đơn giản (ví dụ shell, bash script hoặc khác) để gọi xsl chính của bạn, sử dụng các chế độ xslt tên, tệp xslt chính, một tệp xslt đơn giản (trống) được chỉ định.
Trong xsl chính, bao gồm tệp xsl tĩnh, sẽ gọi/tải tất cả xslt được bao gồm động. Sau đó, xsl chính sẽ hoạt động ở 2 chế độ: chế độ bình thường (chế độ không xác định), nơi nó sẽ tải các tệp xsl mở rộng trong chính nó, và trong các xls tĩnh và xử lý bất kỳ tệp đầu vào nào hoặc làm những gì tốt làm. Chế độ thứ hai, chế độ tiền xử lý, sẽ được dùng để tải các cá thể/tệp xsl được chỉ định dyanimically. Chế độ này sẽ được gọi là một giai đoạn tiền xử lý cho quá trình xử lý chính. Dòng quy trình cho xslt chính sẽ gọi nó bằng chế độ tiền xử lý được chỉ định, và sau đó gọi lại nó với chế độ xử lý thông thường được chỉ ra.
Gợi ý triển khai: Đối với mỗi xlator xác định một tệp xslt mở rộng, ext_xsl_container, có mục đích là bao gồm bất kỳ xslt mở rộng nào. ví dụ:
<xsl:stylesheet >
<!-- main xslt -->
<xsl:import href="../xsl/ext_xsl_container.xsl/>
<!--param: list of dynamically specified extension xsl -->
<xsl:param name="extXslUrlList"/>
<!--param:preprocessor mode flag, with default set to false -->
<xsl:param name="preProcModeLoadXslF" select="false()" type="xs:boolean"
<!-- param: path to the staticall included ext_xsl_container: with default value set -->
<xsl:param name="extXslContainerUrl" select="'../xsl/ext_xsl_container.xsl'"/>
<xsl:if test=" ($preProcModeLoadXslF=true())" >
<xsl:call-template name="loadDynamicXsl" mode="preprocess_load_xsl"
</xsl:if>
....
</xsl:stylesheet>
Biểu định kiểu ext_xslt_container sẽ bao gồm mọi xslts mở rộng. Nó có thể được cập nhật động vào thời gian chạy bằng cách chỉnh sửa nó (như một tài liệu xml), thêm câu lệnh include cho các tệp định kiểu xsl mở rộng. ví dụ
<!-- ext xsl container : ext_xsl_container.xsl-->
<xsl:stylesheet
<xsl:include href="ext_xsl_container.xsl"/>
....
</xsl:stylesheet
Tạo một mẫu nhỏ, nói template_load_ext_xsl, với chế độ giao, nói mode = "preprocess_load_xsl" ví dụ
<xsl:template name="loadDynamicXsl" mode="preprocess_load_xsl">
<!-- param: path to the staticall included ext_xsl_container-->
<xsl:param name="extXslContainerUrl"/>
<!--param: list of dynamically specified extension xsl -->
<xsl:param name="extXslUrlList"/>
<!-- step 1, [optional ] open the ext Xsl container file -->
<!-- step 2 [optional] clear contexts of the ext X -- >
<!-- step3 compile a list of include elements, one per each ext Xsl file -->
<!-- step 4 [optional] create a union of the include elements created with the content of the xsl container file : ie append content >
<!-- step 5 : write the union list of incudes to the ext XSL container file -->
<!-- DONE --->
</xsl:template>
Mẫu sẽ mất như các đối số, tên của ex_xsl_container, và một danh sách các tệp xsl mở rộng (bao gồm cả đường dẫn của chúng) sau đó nó sẽ mở tệp ext_xsl_container dưới dạng tài liệu xml, thêm (tùy chọn chắp thêm hoặc xóa tệp và thêm mã mới) cho từng phần mở rộng: xsl, lưu tệp và thoát ra
Tiếp theo khi bạn chạy xsl chính trong chế độ thi công bình thường, nó willl include template loadDynamicXsl, mà sẽ inturn bao gồm các tập tin XSLT mở rộng specifed tại thời gian chạy
Tạo một kịch bản wrapper đơn giản (ví dụ bash, hoặc shell script) sẽ lấy các đối số cho xslt chính và một tùy chọn để chạy chế độ tiền xử lý. Kịch bản sẽ chỉ gọi xslt chính hai lần, nếu tùy chọn cho chế độ tiền xử lý được bật và bật chế độ tiền xử lý trong lần chạy đầu tiên, tiếp theo là cuộc gọi thứ 2 ở chế độ bình thường
sử dụng –
bvb1909