2009-08-10 38 views
8

Cách tạo XML từ XML bằng XSL?Cách tạo XML từ XML bằng XSL?

tôi cố gắng như thế này .. nhưng tôi không nhận được một kết quả

test.xml

<Address> 
    <name> Alex</name> 
    <lastname>Mathew</lastname> 
</Address> 

Test.xsl

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
<Address> 
     <FirstName><xsl:value-of select="name" /></FirstName> 
     <LastName><xsl:value-of select="lastname" /></LastName> 
</Address> 
</xsl:template> 

</xsl:stylesheet> 

tôi cần ra đặt như thế này

<Address> 
    <FirstName> Alex</FirstName> 
    <LastName>Mathew</LastName> 
</Address> 

Tôi cố gắng chuyển đổi trong asp của tôi ge (test.asp)

<% 
'Load XML 
set xml = Server.CreateObject("Microsoft.XMLDOM") 
xml.async = false 
xml.load(Server.MapPath("Test.xml")) 

'Load XSL 
set xsl = Server.CreateObject("Microsoft.XMLDOM") 
xsl.async = false 
xsl.load(Server.MapPath("Test.xsl")) 

'Response.Write(xml.transformNode(xsl)) 
'Response.ContentType = "text/plain; charset=UTF-8" 

Set doc = Server.CreateObject("Msxml2.DOMDocument.3.0") 
doc.async = False 
doc.loadXML(xml.transformNode(xsl)) 

response.write xml.transformNode(xsl) 

response.write doc.getElementsByTagName("FirstName").item(0).text 
%> 

Plz giúp tôi giải quyết vấn đề này

Trả lời

13

Bạn cũng có thể muốn thêm một chỉ thị đầu ra trong stylesheet của bạn:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" indent="yes"/> 

<xsl:template match="/Address"> 
    <Address> 
    <FirstName><xsl:value-of select="name" /></FirstName> 
    <LastName><xsl:value-of select="lastname" /></LastName> 
    </Address> 
</xsl:template> 

</xsl:stylesheet> 

Điều này làm cho đầu ra để có một tuyên bố xml hàng đầu:

<?xml version="1.0" ?> 
15

Vấn đề là "/"gốc, không phải là yếu tố gốc (hay "yếu tố tài liệu").
Thứ bậc, "/" là một mức ở trên phần tử tài liệu (<Address>, trong trường hợp yor). Vì vậy, điều này:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/Address"> 
    <Address> 
     <FirstName><xsl:value-of select="name" /></FirstName> 
     <LastName><xsl:value-of select="lastname" /></LastName> 
    </Address> 
    </xsl:template> 
</xsl:stylesheet> 

thực sự sẽ hoạt động. Lưu ý sự khác biệt nhỏ bé xíu? đẹp hơn sẽ là:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <!-- the identity template (copies your input verbatim) --> 
    <xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:copy> 
    </xsl:template> 

    <!-- special templates only for things that need them --> 
    <xsl:template match="name"> 
    <FirstName><xsl:value-of select="." /></FirstName> 
    </xsl:template> 

    <xsl:template match="lastname"> 
    <LastName><xsl:value-of select="." /></LastName> 
    </xsl:template> 

</xsl:stylesheet> 
+2

+1 Thậm chí đẹp hơn sẽ sử dụng '' thay vì 'xsl: value-of'. –

+1

@DevNull Đó là điều gây tranh cãi. Nói một cách tự nhiên, vâng; nói về tình hình cụ thể, không thực sự. – Tomalak

3

Chỉ cần mở rộng và làm rõ một chút về những gì Tomalak đã đăng: số gốc của tài liệu XML, trong Phân cấp DOM, phía trên phần tử cấp cao nhất . Nó là đặc biệt phổ biến để xem hai lẫn lộn. Xem xét tài liệu XML này:

<!-- This is a node - yes, comments are nodes. --> 
<root> 
    <child/> 
</root> 
<!-- This is also a node. --> 

Gốc của tài liệu này có ba nút con: nút nhận xét, nút phần tử và nút nhận xét khác. Phần tử cấp cao nhất có tên là root, vì đó là những gì mọi người tạo ra các tài liệu cá thể XML để duy trì sự nhầm lẫn giữa gốc tài liệu và phần tử cấp cao nhất. (Đặc biệt nếu chúng vẫn còn ở điểm trong giáo dục XML của chúng, nơi chúng sử dụng "nút" khi chúng có nghĩa là "phần tử").

Điều này khiến chúng ta trở thành một trong những lý do mà mẫu Tomalak mô tả là "đẹp hơn" là đẹp hơn. Nếu bạn mở rộng biến đổi nhận dạng, điều duy nhất mà XSLT sẽ thay đổi trong tài liệu của bạn là các yếu tố mà bạn đã tạo mẫu. Mỗi nút khác trong tài liệu được sao chép không thay đổi. Vì vậy, nếu tài liệu đầu vào của bạn có các nhận xét xung quanh phần tử cấp cao nhất, như trong ví dụ trên, chúng sẽ không bị tước khỏi đầu ra, vì chúng sẽ đơn giản nếu bạn triển khai một mẫu khớp với phần tử Address.

Tất nhiên, nếu bạn muốn đầu ra của bạn để loại trừ nhận xét, điều đó cũng dễ dàng hoàn thành; chỉ không thực hiện biến đổi nhận dạng.

Các vấn đề liên quan