2010-09-06 31 views
20

Dưới đây là xml thực tế:Thêm phần tử trong giữa xml sử dụng XSLT

<?xml version="1.0" encoding="utf-8"?> 
<employee> 
<Name>ABC</Name> 
<Dept>CS</Dept> 
<Designation>sse</Designation> 
</employee> 

Và tôi muốn đầu ra như sau:

<?xml version="1.0" encoding="utf-8"?> 
<employee> 
<Name>ABC</Name> 
    <Age>34</Age> 
<Dept>CS</Dept> 
    <Domain>Insurance</Domain> 
<Designation>sse</Designation> 
</employee> 

phải là có thể này để thêm phần tử XML trong giữa việc sử dụng XSLT ? Xin vui lòng cho tôi mẫu!

Trả lời

32

Dưới đây là một XSLT 1.0 stylesheet rằng sẽ làm những gì bạn hỏi:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <!-- Identity transform --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Name"> 
     <xsl:copy-of select="."/> 
     <Age>34</Age> 
    </xsl:template> 

    <xsl:template match="Dept"> 
     <xsl:copy-of select="."/> 
     <Domain>Insurance</Domain> 
    </xsl:template> 
</xsl:stylesheet> 

Rõ ràng logic sẽ thay đổi tùy thuộc vào nơi bạn sẽ nhận được các dữ liệu mới từ, và nơi mà nó cần phải đi. Biểu định kiểu trên chỉ cần chèn phần tử <Age> sau mỗi phần tử <Name> và phần tử <Domain> sau mỗi phần tử <Dept>.

(Giới hạn:. Nếu tài liệu của bạn có thể có <Name> hoặc <Dept> yếu tố bên trong <Name> hoặc <Dept> các yếu tố khác, chỉ có những người ngoài cùng sẽ phải xử lý đặc biệt này, tôi không nghĩ rằng bạn có ý định cho tài liệu của bạn để có loại cấu trúc đệ quy Vì vậy, nó sẽ không ảnh hưởng đến bạn, nhưng nó đáng nhắc đến chỉ trong trường hợp.)

+0

gì nếu bạn chỉ muốn phần tử được thêm một lần, thay vì một lần cho tất cả các yếu tố Tên/Dept? – Joe

+1

@Joe: Wow, gần 5 năm sau. :-) Trong trường hợp đó, bạn thêm phần tử kết quả vào mẫu sẽ chỉ khớp một lần. Ví dụ. 'match ="/*/Name [1] "'. – LarsH

+1

Tuyệt vời, tôi đã không thực sự mong đợi một câu trả lời 5 năm sau đó, ít hơn một để nhắc! Điều đó giúp ích rất nhiều – Joe

2

Tôi đã sửa đổi vài thứ trong biểu định kiểu hiện có, nó sẽ cho phép bạn chọn phần tử cụ thể và cập nhật trong xml của bạn.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <!-- Identity transform --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Name[1]"> 
     <xsl:copy-of select="."/> 
     <Age>34</Age> 
    </xsl:template> 

    <xsl:template match="Dept[1]"> 
     <xsl:copy-of select="."/> 
     <Domain>Insurance</Domain> 
    </xsl:template> 
</xsl:stylesheet> 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<employee> 
<Name>ABC</Name> 
<Dept>CS</Dept> 
<Designation>sse</Designation> 
<Name>CDE</Name> 
<Dept>CSE</Dept> 
<Designation>sses</Designation> 
</employee> 
Các vấn đề liên quan