|
|
|
Сравнение 2-х XML средствами XSLT
|
|||
|---|---|---|---|
|
#18+
Мне нужно сравнить два 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 одновременно можно обойти два набора узлов для? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 15:12 |
|
||
|
Сравнение 2-х XML средствами XSLT
|
|||
|---|---|---|---|
|
#18+
XSLT работает только с одним xml соедини 2 xml в один внутри проверяй каждый по своему шаблону ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 11:50 |
|
||
|
Сравнение 2-х XML средствами XSLT
|
|||
|---|---|---|---|
|
#18+
http://sql.ru/forum/actualthread.aspx?tid=248655 Только не пытайтесь написать что-то универсальное. Это никому не нужно. И вообще, лучше делать не сравнение, а валидацию по xml-схеме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 15:12 |
|
||
|
Сравнение 2-х XML средствами XSLT
|
|||
|---|---|---|---|
|
#18+
Проблему удалось решить на основе: http://www.dpawson.co.uk/xsl/sect2/N1777.html Полный код XSLT - в вложенном файле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2006, 00:46 |
|
||
|
Сравнение 2-х XML средствами XSLT
|
|||
|---|---|---|---|
|
#18+
к сожалению, приведенный код не работает:( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2006, 20:25 |
|
||
|
Сравнение 2-х XML средствами XSLT
|
|||
|---|---|---|---|
|
#18+
matheuxк сожалению, приведенный код не работает:( В каком смысле не работает? При сравнении каких XML файлов не работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 00:55 |
|
||
|
Сравнение 2-х XML средствами XSLT
|
|||
|---|---|---|---|
|
#18+
При сравнении двух идентичных выдается куча ошибок несоответствий%) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2006, 15:27 |
|
||
|
Сравнение 2-х XML средствами XSLT
|
|||
|---|---|---|---|
|
#18+
Выложи код xml файлов, которые сравниваешь и то, что выводит программа... Какой XSLT процессор используешь? Эта программа может не правильно сравнивать разные XML файлы вида: <A> <B></B> some text </A> А для одинаковых нечего выдавать не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2006, 23:56 |
|
||
|
Сравнение 2-х XML средствами XSLT
|
|||
|---|---|---|---|
|
#18+
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> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2006, 12:58 |
|
||
|
Сравнение 2-х XML средствами XSLT
|
|||
|---|---|---|---|
|
#18+
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(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2006, 13:49 |
|
||
|
Сравнение 2-х XML средствами XSLT
|
|||
|---|---|---|---|
|
#18+
Да, действительно... Какая-то проблема в сравнении атрибутов... Проверь работу шаблона cmpAtr Код: plaintext 1. 2. Если у меня будет время - то я на этих выходных посмотрю в чем проблема... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2006, 12:18 |
|
||
|
|

start [/forum/topic.php?fid=14&msg=34053970&tid=1334575]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
158ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 480ms |

| 0 / 0 |
