【问题标题】:How create XML from XML using XSL?如何使用 XSL 从 XML 创建 XML?
【发布时间】:2009-08-10 14:53:37
【问题描述】:

如何使用 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
%>

请帮我解决这个问题

【问题讨论】:

    标签: xml xslt asp-classic


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      问题在于"/",而不是根元素(或“文档元素”)。
      从层次上讲,"/" 是文档元素之上 的一层(&lt;Address&gt;,在你的情况下)。所以这个:

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

      【讨论】:

      • +1 比使用&lt;xsl:apply-templates select="node()|@*"/&gt; 代替xsl:value-of 更好。
      • @DevNull 这值得商榷。一般来说,是的;就具体情况而言,不是真的。
      【解决方案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 将在您的文档中更改的唯一内容是您为其构建模板的元素。文档中的所有其他节点都被原封不动地复制。因此,如果您的输入文档在顶级元素周围有 cmets,如上例所示,它们不会像您简单地实现与 Address 元素匹配的模板一样从输出中删除。

      当然,如果您想要您的输出排除 cmets,这也很容易实现;只是不要实现身份转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-13
        • 2019-06-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多