Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Сравнение 2-х XML средствами XSLT / 11 сообщений из 11, страница 1 из 1
12.10.2006, 15:12
    #34050873
3test
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение 2-х XML средствами XSLT
Мне нужно сравнить два XML документа средствами XSLT 1.0.
Шаблоны для сравнения двух узлов - я написал. Но, проблема в том, что я не знаю, как одновременно можно перебрать два набора узлов для их сравнения:

<xsl:variable name="A" select="document('file1.xml')"/>
<xsl:variable name="B" select="document('file2.xml')"/>

в цикле можно перебрать только один набор:

<xsl:for-each select="$A/*">
...
</xsl:for-each>

это ограничение можно было б обойти, если с помощью вызова вспомогательного шаблона :

<xsl:template name="retrieve">
<xsl:param name="name" />
<xsl:param name="nodeSet" />

<xsl:for-each select="$nodeSet">
<xsl:if test="name(.)=name($name)">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:template>

- можно было б вернуть узел со второго набора элементов.

Но при вызове

<xsl:variable name="node">
<xsl:call-template name="retrieve">
<xsl:with-param name="name" select="$e1/A1" />
<xsl:with-param name="nodeSet" select="$e2/*" />
</xsl:call-template>
</xsl:variable>

возвращает только содержание узла.

<xsl:value-of select="name($node)"/> - для такого обращения происходит ошибка компиляции...

Не подскажете, как можно решить такую проблему? Как в XSLT 1.0 одновременно можно обойти два набора узлов для?
...
Рейтинг: 0 / 0
13.10.2006, 11:50
    #34053054
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение 2-х XML средствами XSLT
XSLT работает только с одним xml

соедини 2 xml в один
внутри проверяй каждый по своему шаблону
...
Рейтинг: 0 / 0
13.10.2006, 15:12
    #34053970
M0us
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение 2-х XML средствами XSLT
http://sql.ru/forum/actualthread.aspx?tid=248655

Только не пытайтесь написать что-то универсальное. Это никому не нужно.

И вообще, лучше делать не сравнение, а валидацию по xml-схеме.
...
Рейтинг: 0 / 0
17.10.2006, 00:46
    #34058784
3test
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение 2-х XML средствами XSLT
Проблему удалось решить на основе:
http://www.dpawson.co.uk/xsl/sect2/N1777.html

Полный код XSLT - в вложенном файле.
...
Рейтинг: 0 / 0
07.11.2006, 20:25
    #34110348
matheux
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение 2-х XML средствами XSLT
к сожалению, приведенный код не работает:(
...
Рейтинг: 0 / 0
08.11.2006, 00:55
    #34110554
3test
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение 2-х XML средствами XSLT
matheuxк сожалению, приведенный код не работает:(
В каком смысле не работает? При сравнении каких XML файлов не работает?
...
Рейтинг: 0 / 0
09.11.2006, 15:27
    #34116537
matheux
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение 2-х XML средствами XSLT
При сравнении двух идентичных выдается куча ошибок несоответствий%)
...
Рейтинг: 0 / 0
09.11.2006, 23:56
    #34117764
3test
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение 2-х XML средствами XSLT
Выложи код xml файлов, которые сравниваешь и то, что выводит программа...

Какой XSLT процессор используешь?

Эта программа может не правильно сравнивать разные XML файлы вида:

<A>
<B></B>
some text
</A>

А для одинаковых нечего выдавать не будет.
...
Рейтинг: 0 / 0
10.11.2006, 12:58
    #34119212
matheux
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение 2-х XML средствами XSLT
MSXML, беру одинаковыедокументы на входе, т.е.

Input.xml:

<files>
<file href="my.xml" />
<file href="my.xml" />
</files>

Compare.cmd:

call cscript XMLtransform.js Input.xml Compare.xsl Output.xml

Compare.xsl:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

<xsl:param name="file1"/>
<xsl:param name="file2"/>

<xsl:variable name="A" select="document($file1)" />
<xsl:variable name="B" select="document($file2)"/>




<xsl:template match="/">

<!-- <xsl:value-of select="system-property('name')"/> -->
<xsl:call-template name="cmpElements">
<xsl:with-param name="e1" select="$A/*" />
<xsl:with-param name="e2" select="$B/*" />
</xsl:call-template>

<!-- Process all descendant nodes in A: -->
<xsl:apply-templates select="$A/*//*" mode="A" />
<!-- Process all descendant nodes in B: -->
<xsl:apply-templates select="$B/*//*" mode="B" />
</xsl:template>

<xsl:template match="*" mode="A">

<xsl:variable name="curname" select="name()" />
<xsl:variable name="matching" select="$B/*//*[name() = $curname]"/>



<xsl:choose>
<xsl:when test="$matching">
<!-- <xsl:text>
</xsl:text> -->
<xsl:call-template name="cmpElements">
<xsl:with-param name="e1" select="." />
<xsl:with-param name="e2" select="$matching" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="name()" />(only in A)
</xsl:otherwise>
</xsl:choose>

</xsl:template>

<xsl:template match="*" mode="B">
<!-- Figure out whether this B node has a namesake in A.
If not, mention it. -->
<xsl:variable name="curname" select="name()" />
<xsl:variable name="matching" select="$A/*//*[name() = $curname]"/>
<xsl:if test="not($matching)">
<xsl:value-of select="name()" /> (only in B)
</xsl:if>
</xsl:template>

<!--
Compare two elements.
return error msg, or nothing
-->
<xsl:template name="cmpElements">
<xsl:param name="e1" />
<xsl:param name="e2" />

<xsl:choose>
<xsl:when test="name($e1)=name($e2)">

<xsl:variable name ="atribEqual" >
<xsl:call-template name="cmpAtr">
<xsl:with-param name="e1" select="$e1" />
<xsl:with-param name="e2" select="$e2" />
</xsl:call-template>
</xsl:variable>

<xsl:choose>
<!-- Compare attributes -->
<xsl:when test="$atribEqual=''">
<xsl:choose>
<!-- Compare count of children of elements-->

<xsl:when test="count($e1/*)=count($e2/*)">
<xsl:if test="count($e1/*)=0 and $e1!=$e2">
Text values of elements /<xsl:value-of select="name($e1)"/>/<!-- and <xsl:value-of select="name($e2)"/>--> are not equal.
</xsl:if>

</xsl:when>
<xsl:otherwise>
Elements /<xsl:value-of select="name($e1)"/>/<!-- and <xsl:value-of select="name($e2)"/>--> have different number of children.
</xsl:otherwise>

</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$atribEqual"/>
Attributes of elements <xsl:value-of select="name($e1)"/> and <xsl:value-of select="name($e2)"/> are not equal.
</xsl:otherwise>
</xsl:choose>

</xsl:when>
<xsl:otherwise>
Elements names: <xsl:value-of select="name($e1)"/> and <xsl:value-of select="name($e2)"/> are not equal.
</xsl:otherwise>
</xsl:choose>

</xsl:template>




<xsl:template name="atrExist">
<xsl:param name="atrName" />
<xsl:param name="atrSet" />
<xsl:for-each select="$atrSet">
<xsl:choose>
<xsl:when test="name(.)=$atrName">1</xsl:when>
</xsl:choose>
</xsl:for-each>

</xsl:template>

<xsl:template name="getAtrVal">
<xsl:param name="atrName" />
<xsl:param name="atrSet" />

<xsl:for-each select="$atrSet">
<xsl:choose>
<xsl:when test="name(.)=$atrName">
<xsl:value-of select="."/>
</xsl:when>

</xsl:choose>
</xsl:for-each>

</xsl:template>

<!--
Compare attributes of two elements to equality.
params: elements
return nothing, or message about difference of attributes
-->
<xsl:template name="cmpAtr">
<xsl:param name="e1" />
<xsl:param name="e2" />
<!--<xsl:value-of select="count($e1/@*)"/>
<xsl:value-of select="name($e1/@*)"/>
<xsl:text>
<xsl:value-of select="name($e2/@*)"/>
<xsl:value-of select="count($e2/@*)"/>
</xsl:text> -->
<xsl:choose>
<xsl:when test="count($e1/@*)=count($e2/@*)">


<xsl:for-each select="$e1/@*">

<xsl:variable name ="exist" >
<xsl:call-template name="atrExist">
<xsl:with-param name="atrName" select="name()" />
<xsl:with-param name="atrSet" select="$e2/@*" />
</xsl:call-template>
</xsl:variable>

<xsl:choose>
<xsl:when test="$exist=1">

<xsl:variable name ="atrVal" >
<xsl:call-template name="getAtrVal">
<xsl:with-param name="atrName" select="name()" />
<xsl:with-param name="atrSet" select="$e2/@*" />
</xsl:call-template>
</xsl:variable>

<xsl:if test="$atrVal!=string(.)">
Not equal attribute <xsl:value-of select="name()"/>
</xsl:if>

</xsl:when>
<xsl:otherwise>
Have not attribute <xsl:value-of select="name()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>

</xsl:when>
<xsl:otherwise>
Elements have different number of attribute.
</xsl:otherwise>
</xsl:choose>


</xsl:template>



</xsl:stylesheet>
...
Рейтинг: 0 / 0
10.11.2006, 13:49
    #34119444
matheux
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение 2-х XML средствами XSLT
XMLtransform.js

var oArgs = WScript.Arguments;

if (oArgs.length == 0)
{
WScript.Echo ("Правильный запуск: cscript XMLtransform.js Input.xml Compare.xsl Output.txt");
WScript.Quit();
}

xmlFileName = oArgs(0);
xslFileName = oArgs(1);
txtFileName = oArgs(2);

var xml = new ActiveXObject("MSXML2.DOMDOCUMENT.4.0");

xml.validateOnParse = false;
xml.async = false;
xml.load(xmlFileName);

if (xml.parseError.errorCode != 0)
WScript.Echo ("ERROR (parsing XML): " + xml.parseError.reason);

var xsl = new ActiveXObject("MSXML2.DOMDOCUMENT.4.0");
xsl.async = false;
xsl.load(xslFileName);

if (xsl.parseError.errorCode != 0)
WScript.Echo ("ERROR (parsing XSL) : " + xsl.parseError.reason);

var fso = new ActiveXObject("Scripting.FileSystemObject");
var txt = fso.CreateTextFile(txtFileName, true);

try {
txt.Write(xml.transformNode(xsl));
}
catch(err) {
WScript.Echo ("Ошибка трансформации : " + err.number + " : " + err.description);
}

txt.Close();
...
Рейтинг: 0 / 0
13.11.2006, 12:18
    #34123435
3test
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение 2-х XML средствами XSLT
Да, действительно...
Какая-то проблема в сравнении атрибутов...
Проверь работу шаблона cmpAtr
Код: plaintext
1.
2.
Elements have different number of attribute.
Attributes of elements /file/ and /file/ are not equal.

Если у меня будет время - то я на этих выходных посмотрю в чем проблема...
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Сравнение 2-х XML средствами XSLT / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]