Как создать 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
.
Конечно, если вы хотите, чтобы ваш вывод исключал комментарии, это также легко выполняется; просто не реализуйте преобразование идентичности.