如何使用XSL从XML创建XML?

时间:2009-08-10 14:53:37

标签: xml xslt asp-classic

如何使用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页面中转换(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帮助我解决这个问题

3 个答案:

答案 0 :(得分:17)

您可能还想在样式表中添加输出指令:

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

答案 1 :(得分:16)

问题是"/" root ,而不是根元素(或“文档元素”)。
从层次结构来看,"/"在文档元素(<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>

实际上会有效。注意微小的差别? Nicer 就是这样:

<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 :(得分:3)

只是为了扩展并澄清Tomalak发布的内容:XML文档的 root 在DOM层次结构中位于顶级元素之上。看到两者混淆是特别常见的。请考虑以下XML文档:

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

此文档的根目录有三个子节点:注释节点,元素节点和另一个注释节点。顶级元素名为root,因为这是创建XML实例文档的每个人所做的事情,以便使文档根目录和顶级元素之间的混淆永久化。 (特别是如果他们仍然处于他们的XML教育中,当他们使用“node”时,他们的意思是“元素”。)

这让我们知道Tomalak描述为“更好”的模板更好的原因之一。如果扩展标识转换,XSLT将在文档中更改的唯一内容是您为其构建模板的元素。文档中的每个其他节点都将保持不变。因此,如果您的输入文档有关于顶级元素的注释,如上例所示,它们将不会被剥离出输出,就像您只是实现了与Address元素匹配的模板一样。 / p>

当然,如果您希望您的输出以排除评论,那么这也很容易实现;只是不要实现身份变换。