Вы на самом деле не делаете "пересечение" здесь, потому что все дочерние элементы child1
отличаются от дочерних элементов child2
.Тот факт, что два элемента имеют одно и то же имя, не делает их одним и тем же элементом.
То, что вам нужно, выглядит так: элементы под child1
имеют то же имя, что и элемент под child2
Если вы хотите, чтобы ваше решение XSLT 1.0 получало результаты, вам нужно изменить xsl:copy-of
на
<xsl:copy-of select="/root/child1/child::*[.=$ns2]"/>
Или это ...
<xsl:copy-of select="/root/child1/*[.=$ns2]"/>
Однако, это вернет все child1
дочерние элементы, потому что вы проверяете, совпадают ли значения элементов, а не имени.Один из способов сделать это - это ...
<xsl:for-each select="/root/child1/*">
<xsl:variable name="name" select="local-name()" />
<xsl:copy-of select=".[$ns2[local-name() = $name]]" />
</xsl:for-each>
В качестве альтернативы определите ключ следующим образом:
<xsl:key name="child2" match="child2/*" use="local-name()" />
Тогда вы можете сделать это ...
<xsl:copy-of select="/root/child1/*[key('child2', local-name())]"/>
В XSLT 2.0 вы могли бы сделать что-то вроде этого ...
<xsl:copy-of select="$ns1[some $name in $ns2/local-name() satisfies $name=local-name()]"/>