2007/08/07(Tue) 06:01:30 編集(投稿者)
■No6248 (トラヤ さん) に返信
> XMLのデータを照合して一つのファイルとして出力する処理をしたいのですが、うまくできません。
とりあえず、結合結果を TextBox に表示させてみました。
============================
Dim sXSLT As String = System.IO.Path.Combine(sDir, "XSLT.xsl") '後述
Dim sXML1 As String = System.IO.Path.Combine(sDir, "XML1.xml") '元データ
Dim sXML2 As String = System.IO.Path.Combine(sDir, "XML2.xml") '上書き用の比較データ
Dim xslt As New System.Xml.Xsl.XslTransform()
xslt.Load(sXSLT)
Dim doc1 As New System.Xml.XPath.XPathDocument(sXML1)
Dim xslArg As New System.Xml.Xsl.XsltArgumentList()
xslArg.AddParam("DataFile", "", sXML2)
Dim outStream As New System.IO.MemoryStream()
xslt.Transform(doc1, xslArg, outStream)
outStream.Position = 0
Dim reader As New IO.StreamReader(outStream)
TextBox1.Text = reader.ReadToEnd()
reader.Close()
============================
以下、結合処理用の XSLT ファイルです。
============================
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:param name="DataFile" />
<xsl:template match="key">
<xsl:variable name="test" select="document($DataFile)/common/test" />
<xsl:variable name="testName" select="../../@name"/>
<xsl:variable name="sectionName" select="../@name"/>
<xsl:variable name="keyName" select="@name"/>
<xsl:variable name="value" select="$test[@name=$testName]/section[
@name=$sectionName]/key[@name=$keyName]/@value"/>
<key name="{@name}">
<xsl:attribute name="value">
<xsl:choose>
<xsl:when test="$value"><xsl:value-of select="$value"/></xsl:when>
<xsl:otherwise><xsl:value-of select="@value"/></xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</key>
</xsl:template>
<xsl:template match="@*|*|text()">
<xsl:copy><xsl:apply-templates select="@*|*|text()" /></xsl:copy>
</xsl:template>
</xsl:stylesheet>
============================
<test>, <section>, <key> の各 name 属性が一致した場合のみ、value 属性を上書きし、
もし、元データ側に無い key が含まれていた場合は、その key を無視するようにしてあります。