Performing Set Operations on Node Sets Using Value Semantics
Problem
You
need to find the union, intersection, set difference, or symmetrical
set difference between elements in two node sets; however, in your
problem, equality
is not defined as
node-set identity
. In other words,
equality
is a function of a
node’s value.
Solution
The need for this solution may arise when working with multiple documents. Consider two documents with the same DTD but content that may not contain duplicate element values. XSLT elements coming from distinct documents are distinct even if they contain elements with the same namespace, attribute, and text values. See Example 7-1 to Example 7-4.
Example 7-1. people1.xslt
<people> <person name="Brad York" age="38" sex="m" smoker="yes"/> <person name="Charles Xavier" age="32" sex="m" smoker="no"/> <person name="David Willimas" age="33" sex="m" smoker="no"/> </people>
Example 7-2. people2.xslt
<people> <person name="Al Zehtooney" age="33" sex="m" smoker="no"/> <person name="Brad York" age="38" sex="m" smoker="yes"/> <person name="Charles Xavier" age="32" sex="m" smoker="no"/> </people>
Example 7-3. Failed attempt to use XSLT union to select unique people
<xsl:template match="/"> <people> <xsl:copy-of select="//person | document('people2.xml')//person"/> </people> </xsl:template>
Example 7-4. Output when run with people1.xml as input
<people> <person name="Brad York" age="38" sex="m" smoker="yes"/> <person name="Charles Xavier" age="32" sex="m" smoker="no"/> ...
Get XSLT Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.