Как создать XML из XML с помощью XSL?

Как создать XML из XML с помощью XSL?

Я пробую вот так.. но я не получаю результат

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 помогите мне решить эту проблему

Ответ 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

Проблема заключается в том, что "/" является корнем, а не корневым элементом (или "элементом документа" ).
Иерархически, "/" - это один уровень над элементом документа (<Address>, в случае yor). Итак:

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

Ответ 3

Просто для того, чтобы подробно рассказать о том, что сказал Tomalak: корень XML-документа находится в иерархии DOM над элементом верхнего уровня. Это исключительно распространено, чтобы увидеть, как они смущены. Рассмотрим этот XML-документ:

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

Корень этого документа содержит три дочерних узла: комментарий node, элемент node и еще один комментарий node. Элемент верхнего уровня называется root, потому что все, кто создает документы экземпляра XML, делает это, чтобы увековечить путаницу между корнем документа и элементом верхнего уровня. (Особенно, если они все еще находятся в точке своего XML-образования, где они используют "node", когда они означают "элемент".)

Это приводит нас к одной из причин того, что шаблон, который Томалак описывает как "более приятный", приятнее. Если вы расширите преобразование идентичности, единственное, что XSLT изменит в вашем документе, - это те элементы, для которых вы создали шаблоны. Все остальные node в документе копируются без изменений. Поэтому, если ваш входной документ имеет комментарии вокруг элемента верхнего уровня, как в приведенном выше примере, они не будут удалены из вывода, как если бы вы просто внедрили шаблон, соответствующий элементу Address.

Конечно, если вы хотите, чтобы ваш вывод исключал комментарии, это также легко выполняется; просто не реализуйте преобразование идентичности.