Tôi có một số phép biến đổi XSLT 2.0 phức tạp. Tôi đang cố gắng tìm hiểu xem có cách nào có mục đích chung để đảm bảo rằng không có thẻ trống nào được xuất ra. Vì vậy, ... về mặt khái niệm, một giai đoạn xử lý cuối cùng sẽ loại bỏ đệ quy tất cả các thẻ trống. Tôi hiểu điều này có thể được thực hiện bởi một XSLT riêng biệt mà không làm gì ngoài việc lọc ra các thẻ rỗng, nhưng tôi cần phải có tất cả các gói được đóng gói cùng nhau trong một thẻ duy nhất.Xử lý hai pha: Không xuất các thẻ trống từ quá trình xử lý XSLT 2.0 giai đoạn 1
Trả lời
XSLT này 2.0 chuyển đổi minh họa cách đa-pass (trong trường hợp này 2-pass) xử lý có thể được thực hiện:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*" mode="#all">
<xsl:copy>
<xsl:apply-templates select="node()|@*" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:variable name="vPass1">
<xsl:apply-templates/>
</xsl:variable>
<xsl:apply-templates select="$vPass1/*" mode="non-empty"/>
</xsl:template>
<xsl:template match="text()[xs:integer(.) mod 2 eq 0]"/>
<xsl:template match="*[not(node())]" mode="non-empty"/>
</xsl:stylesheet>
khi áp dụng trên tài liệu XML này:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
Nó tạo ra một tài liệu kết quả trong lần vượt qua đầu tiên (được ghi lại trong biến số $vPass1
), trong đó tất cả các phần tử <num>
có nội dung thậm chí là intege r bị tước bỏ nội dung của họ và trống rỗng. Sau đó, trong lần truyền thứ hai, được áp dụng trong một chế độ cụ thể, tất cả các phần tử trống sẽ bị xóa.
Kết quả của việc chuyển đổi là:
<nums>
<num>01</num>
<num>03</num>
<num>05</num>
<num>07</num>
<num>09</num>
</nums>
Do lưu ý việc sử dụng các chế độ, và các phương thức đặc biệt #all
và #current
.
Cập nhật: OP bây giờ muốn trong nhận xét để xóa "đệ quy" "tất cả các nút không có hậu duệ không trống".
Điều này có thể được triển khai đơn giản hơn bằng cách sử dụng không đệ quy rõ ràng. Chỉ cần thay đổi:
<xsl:template match="*[not(node())]" mode="non-empty"/>
tới:
<xsl:template match="*[not(descendant::text())]" mode="non-empty"/>
Điều này trả lời câu hỏi tổng thể, nhưng có một phần cụ thể nó bỏ qua - đệ quy xóa tất cả các thẻ trống ... vì vậy tôi chỉ cần thay đổi "* [not (node ())]" thành một biểu thức thích hợp có nghĩa là tất cả các nút không có hậu duệ không trống. – mentics
@taotree Thời gian tới nêu rõ câu hỏi của bạn tốt hơn. :) Tôi nghĩ rằng tốt nhất là làm cho yêu cầu mới này là một câu hỏi riêng biệt - nó cũng sẽ là một câu hỏi tuyệt vời. Bạn có thể sử dụng cho mẫu đối sánh của mẫu trống này: '* [not (descendant :: text())]' –
@taotree Cập nhật câu trả lời để phản ánh yêu cầu mới của bạn ... :) –
- 1. Nâng cấp bộ xử lý XSLT PHP lên XSLT 2.0
- 2. Xử lý lỗi phân đoạn
- 3. Xử lý chuỗi rỗng trong hàm XSLT
- 4. Trình xử lý gián đoạn XPC có được gọi khi launchd giết quá trình không?
- 5. Xử lý danh sách trống trong mustache.js
- 6. Node.js vượt qua xử lý của xử lý đối tượng phản ứng cho quá trình con
- 7. Trình xử lý đăng xuất Symfony
- 8. Cách xử lý các yêu cầu servlet trong quá trình tắt máy dài
- 9. Trình xử lý ghi nhớ
- 10. cách hiệu quả để xử lý các đoạn đường 2d
- 11. Trình xử lý ngắt có thể được xử lý bởi cùng một trình xử lý ngắt không?
- 12. cách tích hợp xử lý TODO vào giai đoạn thử nghiệm maven?
- 13. PHP được xử lý "0" là trống?
- 14. Nhận quy trình đang chạy xử lý được xử lý
- 15. Xử lý các chương trình thu nhỏ
- 16. Thêm quá trình xử lý opencv vào ứng dụng gstreamer
- 17. Tạo trình xử lý sự kiện C# trống
- 18. Không có đầu ra in từ đa xử lý con. Xử lý trừ khi chương trình gặp sự cố
- 19. Unhandled ngoại lệ xử lý không được gọi cho Metro/WinRT UI async xử lý sự kiện khoảng trống
- 20. Ngoại lệ chưa xử lý không bị xử lý lỗi Global.asax hoặc trình xử lý lỗi IHttpModule tùy chỉnh
- 21. Xử lý một phần tệp bằng bộ tiền xử lý
- 22. Xử lý nhiều SIGCHLD
- 23. Cách xử lý đúng cách xử lý các quy trình con
- 24. Khả năng xử lý đa xử lý Python
- 25. ANDROID - dx xử lý quá chậm
- 26. jquery trống chức năng và sự kiện xử lý
- 27. Xử lý lỗi từ HttpWebRequest.GetResponse
- 28. Xử lý gián đoạn Linux trong không gian người dùng
- 29. Cách xử lý các mảng trống trong Firebase?
- 30. Xử lý vấn đề ngoại lệ chưa được xử lý
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 chi tiết. –