2009-08-10 96 views
8

如何使用XSL從XML創建XML?如何使用XSL從XML創建XML?

我嘗試這樣的..但我沒有得到的結果

的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> 

我需要出去把這樣

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

我嘗試在我的asp pa中轉換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幫我解決這個問題

回答

13

你可能也想在你的樣式表添加一個輸出指令:

<?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> 

這使得輸出有一個領先的XML聲明:

<?xml version="1.0" ?> 
15

的問題是,"/",而不是根元素(或 「文檔元素」)。
從等級上來看,"/"以上的一個等級的文檔元素(<Address>,在此情況下)。所以這個:

<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> 

實際上會工作。注意微小的差別? 一些好的會是這樣:

<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甚至比使用'xsl:apply-templates select =「node()| @ *」/>'而不是'xsl:value-of'更好。 – 2011-12-01 20:19:27

+1

@DevNull這是有爭議的。一般來說,是的。就特定情況而言,並不是真的。 – Tomalak 2011-12-01 20:57:03

3

只是爲了擴大和澄清什麼Tomalak張貼:XML文檔的是,在DOM層次結構,高於頂級元素。看到這兩個人混淆是非常普遍的。考慮這個XML文檔:

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

該文檔的根有三個子節點:一個註釋節點,一個元素節點和另一個註釋節點。頂層元素名爲root,因爲每個創建XML實例文檔的人都會這樣做,以便永久化文檔根目錄和頂級元素之間的混淆。 (尤其是如果他們仍然處在他們的XML教育中,當他們使用「節點」時,他們的意思是「元素」)。)

這使我們瞭解Tomalak描述爲「更好」的模板的原因之一更好。如果擴展身份轉換,那麼XSLT在您的文檔中唯一會改變的就是您爲其構建模板的元素。文檔中的每個其他節點都會被原樣複製。因此,如果您的輸入文檔在頂層元素周圍有註釋(如上例所示),它們將不會從輸出中剝離出來,因爲如果您只是實現了與Address元素相匹配的模板,那麼它們也是如此。

當然,如果你你的輸出排除評論,這也很容易實現;只是不實施身份轉換。