Как создать XML из XML с использованием XSL? - PullRequest
12 голосов
/ 10 августа 2009

Как создать 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
%>

Плз, помогите мне решить эту проблему

Ответы [ 3 ]

17 голосов
/ 10 августа 2009

Вы также можете добавить директиву вывода в таблицу стилей:

<?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" ?>
16 голосов
/ 10 августа 2009

Проблема в том, что "/" - это корневой , а не корневой элемент (или "элемент документа").
Иерархически "/" на один уровень выше элемента документа (<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>
3 голосов
/ 10 августа 2009

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...