2009-09-15 10 views
10

Tôi đang cố gắng chuẩn hóa biểu diễn một số dữ liệu XML bằng cách sắp xếp các thuộc tính của từng phần tử theo tên (không phải giá trị). Ý tưởng là để giữ sự khác biệt về văn bản tối thiểu khi các thuộc tính được thêm vào hoặc bị loại bỏ và để ngăn các trình soạn thảo khác nhau đưa ra các biến thể tương đương. Các tệp XML này nằm dưới sự kiểm soát nguồn và các nhà phát triển đang muốn thay đổi các thay đổi mà không cần sử dụng các công cụ XML chuyên dụng.Sử dụng XSL để sắp xếp các thuộc tính

Tôi đã rất ngạc nhiên khi không phải tìm ví dụ XSL về cách thực hiện điều này. Về cơ bản tôi chỉ muốn biến đổi danh tính với các thuộc tính được sắp xếp. Tôi nghĩ ra những điều sau đây có vẻ như hoạt động trong tất cả các trường hợp thử nghiệm của tôi:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="*|/|text()|comment()|processing-instruction()"> 
    <xsl:copy> 
    <xsl:for-each select="@*"> 
     <xsl:sort select="name(.)"/> 
     <xsl:copy/> 
     </xsl:for-each> 
     <xsl:apply-templates/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Như một tổng XSL n00b, tôi sẽ đánh giá cao bất kỳ nhận xét nào về phong cách hoặc hiệu quả. Tôi nghĩ rằng nó có thể hữu ích để đăng nó ở đây vì nó có vẻ là ít nhất không phải là một ví dụ phổ biến.

Trả lời

11

Với xslt là ngôn ngữ chức năng thực hiện cho từng người thường có thể là con đường dễ dàng nhất cho con người chúng ta nhưng không hiệu quả nhất cho bộ vi xử lý XSLT vì chúng không thể tối ưu hóa hoàn toàn cuộc gọi.

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="*"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"> 
     <xsl:sort select="name()"/> 
     </xsl:apply-templates> 
     <xsl:apply-templates/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="@*|comment()|processing-instruction()"> 
    <xsl:copy />  
    </xsl:template> 
</xsl:stylesheet> 

Điều này hoàn toàn không quan trọng trong trường hợp này và là "XSL n00b" tôi nghĩ bạn đã giải quyết được vấn đề rất tốt.

2

Thực hiện tốt để giải quyết vấn đề. Như tôi cho rằng bạn biết thứ tự hoặc thuộc tính là không quan trọng đối với các trình phân tích cú pháp XML nên lợi ích chính của bài tập này là cho con người - một máy sẽ sắp xếp lại chúng theo đầu vào hoặc đầu ra theo những cách không thể đoán trước.

Canonicalization trong XML không phải là tầm thường và bạn sẽ được khuyên nên sử dụng canonicalizer được cung cấp với bất kỳ bộ công cụ XML hợp lý nào thay vì viết của riêng bạn.

+0

Biến áp XSL có đảm bảo rằng thứ tự bạn chỉ định cho các thuộc tính là thứ tự được viết ra không? –

+3

Các công cụ XML không đảm bảo rằng bất kỳ đầu ra XML nào giữ nguyên thứ tự thuộc tính ngay cả khi bạn cố gắng xây dựng nó như trên. Cũng nên nhớ rằng bạn thậm chí không thể đảm bảo biểu tượng nào được sử dụng để trích dẫn các giá trị. So sánh so sánh về XML thường là một ý tưởng tồi. –