Subject: [xsl] Friday challenge: XSLT thats creates XPaths for meaningfully equivalent comparisons of XML files From: "Andrew Welch" <andrew.j.welch@xxxxxxxxx> Date: Fri, 13 Apr 2007 11:48:26 +0100 |
This is a slight variation of the "generate xpaths to all elements" problem. Here the goals is to create a set of XPaths from a given XML document, such that when applied to an XML document if all XPaths return true, the two XML documents are meaningfully equivalent.
Why? Well before setting about upgrading existing transforms to 2.0, or say performance tuning, its useful to have tests in place to ensure the output after the modifications is still the same as before. One simple way to do this is use a tool like CheckXML with a set of generated XPaths.
<root> <foo fooatt="att">foo</foo> <bar>bar</bar> <bar>baz</bar> </root>
<xsl:template match="/"> <checkXML> <xml src="{document-uri(/)}"> <xsl:for-each select="//*"> <xsl:variable name="path" select="concat('/', string-join(for $x in ancestor-or-self::* return concat($x/local-name(), '[', count(.|$x/preceding-sibling::*[name() = current()/name()]), ']'), '/'))" as="xs:string"/> <xsl:for-each select="text()[normalize-space(.) != '']"> <check><xsl:value-of select="concat($path, '/text[', position(), '] = ''', .,'''')"/></check> </xsl:for-each> <xsl:for-each select="@*"> <check><xsl:value-of select="concat($path, '/@', name(), ' = ''', ., '''')"/></check> </xsl:for-each> </xsl:for-each> </xml> </checkXML> </xsl:template>
<checkXML> <xml src="file:/C:/test.xml"> <check>/root[1]/foo[1]/text[1] = 'foo'</check> <check>/root[1]/foo[1]/@fooatt = 'att'</check> <check>/root[1]/bar[1]/text[1] = 'bar'</check> <check>/root[1]/bar[2]/text[1] = 'baz'</check> </xml> </checkXML>
The above transform is quick attempt to demonstrate the problem, I'm sure it can be improved on.
Also, if there are any thoughts about this approach it would be good to hear them.
cheers andrew
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Condition Based Count of , Abel Braaksma | Thread | Re: [xsl] Friday challenge: XSLT th, Robert Koberg |
Re: [xsl] Condition Based Count of , Abel Braaksma | Date | Re: [xsl] Friday challenge: XSLT th, Robert Koberg |
Month |