web-dev-qa-db-ja.com

XSLを使用してXMLからXMLを作成するにはどうすればよいですか?

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は私がこの問題を解決するのを手伝ってくれます

12
Alex

スタイルシートに出力ディレクティブを追加することもできます。

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

問題はそれです "/"ルートであり、ルート要素(または「ドキュメント要素」)ではありません。
階層的に、"/"は1つのレベルです上記ドキュメント要素(<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>
17
Tomalak

Tomalakが投稿した内容を少し拡張して明確にするために、XMLドキュメントのrootは、DOM階層では、トップレベル要素の上にあります。 2つが混乱しているのを見るのは非常に一般的です。このXMLドキュメントについて考えてみましょう。

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

このドキュメントのルートには、コメントノード、要素ノード、および別のコメントノードの3つの子ノードがあります。トップレベル要素の名前はrootです。これは、ドキュメントルートとトップレベル要素の間の混乱を永続させるために、XMLインスタンスドキュメントを作成するすべての人がこれを行うためです。 (特に、XML教育の中で、「要素」を意味するときに「ノード」を使用する段階にある場合は特にそうです。)

これにより、Tomalakが「より良い」と説明しているテンプレートの方が優れている理由の1つにたどり着きます。 ID変換を拡張する場合、XSLTがドキュメントで変更するのは、テンプレートを作成した要素だけです。ドキュメント内の他のすべてのノードは変更されずにコピーされます。したがって、上記の例のように、入力ドキュメントの最上位要素の周りにコメントがある場合、Address要素に一致するテンプレートを単純に実装した場合のように、コメントが出力から削除されることはありません。

もちろん、コメントを除外するために出力をwantした場合、それも簡単に実行できます。 ID変換を実装しないでください。

4
Robert Rossney