2011-07-01 39 views
5

Tôi là người dùng mới cho XSLT và đã đấu tranh với vấn đề này.XSL để Sao chép nút gốc thành + thêm thuộc tính

Nguồn XML:

<ABC X="" Y="" Z=""/> 

quả XML:

<CDE F=""> 
<ABC X="" Y="" Z"" G=""/> 
</CDE> 

Vì vậy, tôi cần phải

  • Tạo một nút gốc với một thuộc tính với một giá trị mặc định trong xml kết quả.
  • Nút sao chép (nguồn chỉ có một nút) từ nguồn đến kết quả xml.
  • Thêm thuộc tính bổ sung vào nút được sao chép từ xml nguồn.

Tôi có thể làm điều này một cách riêng biệt nhưng tôi không thể thực hiện tất cả những điều này trong một XSLT.

+1

+1 cho câu hỏi sạch. –

+0

+1 cho những gì empo đã nói –

Trả lời

2

Với giả định của bạn, có vẻ như bạn cần một mẫu tối thiểu:

<xsl:template match="ABC"> 
<CDE F=""> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:attribute name="G">hello</xsl:attribute> 
    </xsl:copy> 
</CDE> 
</xsltemplate> 

hoặc, nếu bạn thích:

<xsl:template match="/"> 
<CDE F=""> 
    <xsl:apply-templates select="ABC"/> 
</CDE> 
</xsl:template> 

<xsl:template match="ABC"> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:attribute name="G">hello</xsl:attribute> 
    </xsl:copy> 
</xsl:template> 
0

dụ XML của bạn không cần đến nó (xem @ câu trả lời empo của), nhưng khi bắt đầu điều quan trọng nhất để tìm hiểu là mẫu "biến đổi nhận dạng". Về cơ bản nó sao chép tất cả các đầu vào XML của bạn như là và chưa sửa đổi. Bất kỳ thay đổi nào bạn cần thực hiện thường có thể được thực hiện bằng cách ghi đè biến đổi nhận dạng với các mẫu khác.

Dưới đây là một ví dụ stylesheet cung cấp cho bạn kết quả bạn đang tìm kiếm:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <!--IDENTITY TRANSFORM--> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/ABC"> 
    <CDE F=""> 
     <ABC G=""> 
     <xsl:copy-of select="@*"/> 
     </ABC> 
    </CDE> 
    </xsl:template> 

</xsl:stylesheet> 

LƯU Ý: Các "bản sắc chuyển hóa" không được sử dụng khi xử lý XML đầu vào của bạn bởi vì match="/ABC" mẫu xử lý một trong những yếu tố bạn có. Tuy nhiên, nếu bạn đã thêm một cái gì đó vào XML của bạn, nó sẽ được bao gồm trong đầu ra không thay đổi.

Ví dụ, đây XML đầu vào biến đổi:

<ABC X="" Y="" Z=""> 
    <FOO BAR=""/> 
</ABC> 

transfomed với stylesheet sau (tương tự như trên, chỉ có tôi thêm <xsl:apply-templates/> đến /ABC mẫu):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <!--IDENTITY TRANSFORM--> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/ABC"> 
    <CDE F=""> 
     <ABC G=""> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
     </ABC> 
    </CDE> 
    </xsl:template> 

</xsl:stylesheet> 

sản xuất như sau đầu ra:

<CDE F=""> 
    <ABC G="" X="" Y="" Z=""> 
     <FOO BAR=""/> 
    </ABC> 
</CDE> 
Các vấn đề liên quan