Я хотел бы объединить два XML-файла в один, используя xslt.
файл 1:
<W>
<S event="idle" guid="328775aa-87fd-4f9c-b474-7b5d9d5a63b8" />
<S event="moving" guid="2db271fe-56c5-9ac8-9050-e2db2a653165" />
<S event="moving" guid="f90571fe-57f2-4204-9dd0-e2db2a634feb" />
<S event="moving" guid="4759ac82-d4f2-4fb3-9e60-36c531650cce" />
<S event="moving" guid="67450f05-eb20-4306-97aa-0357b9e83589" />
<S event="moving" guid="32f91c48-4865-48aa-a1c1-2a80b1b73cf6" />
<S event="idle" guid="33a06ae1-69a2-41f3-b295-663579b2477e" />
</W>
файл 2:
<EpiVPED>
<vpeds guid="2db271fe-56c5-9ac8-9050-e2db2a653165" attachto="current">
<dp>
<name>Current</name>
</dp>
</vpeds>
<vpeds guid="f90571fe-57f2-4204-9dd0-e2db2a634feb" attachto="start">
<dp>
<name>Start</name>
</dp>
</vpeds>
<vpeds guid="4759ac82-d4f2-4fb3-9e60-36c531650cce" attachto="end">
<dp>
<name>End</name>
</dp>
</vpeds>
</EpiVPED>
объединено:
<W>
<S event="idle" guid="328775aa-87fd-4f9c-b474-7b5d9d5a63b8">
<DataHandler>
<vpeds guid="f90571fe-57f2-4204-9dd0-e2db2a634feb" attachto="start">
<dp>
<name>Start</name>
</dp>
</vpeds>
</DataHandler>
</S>
<S event="moving" guid="2db271fe-56c5-9ac8-9050-e2db2a653165" >
<DataHandler>
<vpeds guid="2db271fe-56c5-9ac8-9050-e2db2a653165" attachto="current">
<dp>
<name>Current</name>
</dp>
</vpeds>
</DataHandler>
</S>
<S event="moving" guid="f90571fe-57f2-4204-9dd0-e2db2a634feb" >
<DataHandler />
</S>
<S event="moving" guid="4759ac82-d4f2-4fb3-9e60-36c531650cce" >
<DataHandler />
</S>
<S event="moving" guid="67450f05-eb20-4306-97aa-0357b9e83589" >
<DataHandler />
</S>
<S event="moving" guid="32f91c48-4865-48aa-a1c1-2a80b1b73cf6">
<DataHandler>
<vpeds guid="4759ac82-d4f2-4fb3-9e60-36c531650cce" attachto="end">
<dp>
<name>End</name>
</dp>
</vpeds>
</DataHandler>
</S>
<S event="idle" guid="33a06ae1-69a2-41f3-b295-663579b2477e">
<DataHandler />
</S>
</W>
Здесь мне нужно скопировать узел vpeds (файл 2) в узел S (файл 1), если он удовлетворяет следующим условиям
1) скопировать узел vpeds в узел S, если обе направляющиеvpeds и S соответствует AND attachto == текущий
2) копирует узел vpeds в предыдущий S, который имеет событие == бездействующий, если обе направляющие vpeds и S совпадают, и attachto == start
3) скопируйте узел vpeds в непосредственный узел S следующего узла S, который имеет событие == idle, если обе направляющие vpeds и S совпадают, и attachto == end
Я попытался с помощью следующего кода
Здесь, в коде C #, я передаю file1 в качестве основного файла и file2 в качестве аргумента.
XmlDocument OutputGPSDoc= new XmlDocument();
XsltSettings xslsettings = new XsltSettings
{
EnableScript = true,
EnableDocumentFunction=true
};
XsltArgumentList _xslArg = new XsltArgumentList();
_xslArg.AddParam("vpedFilePath", "", @"D:\file2.xml");
XmlResolver secureResolver = new XmlSecureResolver(new XmlUrlResolver(), xslPath);
XslCompiledTransform oXslt = new XslCompiledTransform(true);
oXslt.Load(xslPath, xslsettings, secureResolver);
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
settings.IgnoreWhitespace = true;
using (XmlReader reader = XmlReader.Create(@"D:\file1.xml", settings))
{
StringBuilder builder = new StringBuilder();
using (StringWriter stringWriter = new StringWriter(builder))
{
using (XmlWriter writer = XmlWriter.Create(stringWriter))
{
oXslt.Transform(reader, _xslArg, writer);
}
}
OutputGPSDoc.LoadXml(builder.ToString());
builder = null;
}
OutputGPSDoc.Save(@"D:\merged.xml");
Ниже xslt-код для преобразования
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:utils="urn:myExtension">
<xsl:output method="xml" encoding="utf-16" />
<xsl:param name="vpedFilePath"/>
<xsl:param name="updates" select="document($vpedFilePath)" />
<xsl:variable name="updateItems" select="$updates/EpiVPED/./*" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:strip-space elements="S" />
<xsl:template match="/">
<xsl:apply-templates select="/W" />
</xsl:template>
<xsl:template match="/W">
<xsl:element name="W">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="/W/S">
<xsl:element name="S">
<xsl:attribute name="event">
<xsl:value-of select= "@event" />
</xsl:attribute>
<xsl:variable name="GUID">
<xsl:value-of select= "@guid" />
</xsl:variable>
<xsl:attribute name="guid">
<xsl:value-of select= "$GUID" />
</xsl:attribute>
<xsl:element name="DataHandler">
<xsl:choose>
<xsl:when test="@event='idle'">
<!-- need to copy if satisfies the condition mentioned -->
</xsl:when>
<xsl:when test="following-sibling::S[1]/@event='idle'">
<!-- need to copy if satisfies the condition mentioned -->
</xsl:when>
<xsl:when test="$updateItems[@guid=$GUID and @attachto='2']">
<xsl:copy-of select="$updateItems[@guid=$Guid]"/>
</xsl:when>
</xsl:choose>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Я не знаю, каксделай это .Как я новичок в xslt.У кого-нибудь есть идеи?Я использую XSLT версии 1.0.