Imp
12.10.2006, 19:46
Мне нужно сравнить два 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 одновременно можно обойти два набора узлов?
У кого-то есть какие-то идеи по этому поводу?
Шаблоны для сравнения двух узлов - я написал. Но, проблема в том, что я не знаю, как одновременно можно перебрать два набора узлов для их сравнения:
<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 одновременно можно обойти два набора узлов?
У кого-то есть какие-то идеи по этому поводу?