2009-02-21 40 views
7

Tôi có một tệp XML đầu vào mà tôi cần phải sao chép 1: 1 vào đầu ra, ngoại trừ một phần con chứa các phần con cần được sắp xếp.Cách sắp xếp một subelement của XML với XSLT

<?xml version="1.0"?> 
<top> 
    <elementA /> 
    <elementB /> 
    <contents> 
     <contentitem> 
      <id>3</id> 
      <moretags1 /> 
      <moretags2 /> 
     </contentitem> 
     <contentitem> 
      <id>2</id> 
      <moretags1 /> 
      <moretags2 /> 
     </contentitem> 
     <contentitem> 
      <id>1</id> 
      <moretags1 /> 
      <moretags2 /> 
     </contentitem> 
    </contents> 
</top> 

Tôi muốn chuyển đổi XSL đặt các phần tử "contentitem" theo thứ tự, được sắp xếp theo các phần tử "id" của chúng. Tất cả các thẻ khác, bao gồm các thẻ lồng nhau, phải được sao chép đúng nguyên văn. Tôi đã thử với xsl: copy, nhưng hoặc là tôi nhận được nội dung gấp đôi hoặc một cái gì đó biến mất.

Trả lời

7

Đánh dấu Gravell là gần đúng - với một vấn đề nhỏ mà tạo ra hai yếu tố <contents> lồng nhau. Lưu ý tất cả những người cung cấp câu trả lời: Hãy kiểm tra các giải pháp của bạn!

Đây là giải pháp đúng. Sự biến đổi:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<!--            --> 
<xsl:strip-space elements="*"/> 
<!--            --> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 
<!--            --> 
    <xsl:template match="contents"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:apply-templates select="contentitem"> 
     <xsl:sort select="id" data-type="number"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

khi áp dụng trên tài liệu XML ban-cung cấp:

<top> 
    <elementA /> 
    <elementB /> 
    <contents> 
     <contentitem> 
      <id>3</id> 
      <moretags1 /> 
      <moretags2 /> 
     </contentitem> 
     <contentitem> 
      <id>2</id> 
      <moretags1 /> 
      <moretags2 /> 
     </contentitem> 
     <contentitem> 
      <id>1</id> 
      <moretags1 /> 
      <moretags2 /> 
     </contentitem> 
    </contents> 
</top> 

tạo ra truy nã, chính xác kết quả:

<top> 
    <elementA/> 
    <elementB/> 
    <contents> 
     <contentitem> 
     <id>1</id> 
     <moretags1/> 
     <moretags2/> 
     </contentitem> 
     <contentitem> 
     <id>2</id> 
     <moretags1/> 
     <moretags2/> 
     </contentitem> 
     <contentitem> 
     <id>3</id> 
     <moretags1/> 
     <moretags2/> 
     </contentitem> 
    </contents> 
</top> 

Đừng chú ý theo dõi:

  1. Việc sử dụng các identity rule để sao chép tất cả các nút mà không cần thay đổi.

  2. Làm thế nào template sắc được overriden với một mẫu cụ thể phù hợp với contents yếu tố

  3. Việc sử dụng các <xsl:sort> hướng dẫn để trình bày các kết quả của việc áp dụng một khuôn mẫu theo một thứ tự cụ thể, có thể khác nhau từ thứ tự tài liệu của các nút, được chọn để xử lý.

0

Sử dụng xsl: sort với một trong hai xsl: for-each hay xsl: apply-templates

Something như

<xsl:template match='/top/contents'> 
    <xsl:apply-templates select='contentitem'> 
    <xsl:sort select='id' data-type='number'/> 
    </xsl:apply-templates> 
</xsl:template> 

Nhiều xsl: yếu tố loại có thể được sử dụng cho nhiều loại phím.

+0

Lưu ý bạn đã không viết những yếu tố , cũng không phải bất kỳ thuộc tính trên đó ... –

+0

Đây không phải là một giải pháp hoàn chỉnh, thay vì tập trung vào việc làm thế nào để sắp xếp. – Richard

2

Làm thế nào về: giải pháp

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="/top/contents"> 
    <contents> 
     <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:apply-templates select="contentitem"> 
      <xsl:sort data-type="number" select="id"/> 
     </xsl:apply-templates> 
     </xsl:copy> 
    </contents> 
    </xsl:template> 
</xsl:stylesheet> 
Các vấn đề liên quan