Соответствие XPath относится к «текущему узлу» (то есть текущей позиции) в сопоставляемом XML.
*
соответствует всем дочерним элементам текущего узла, тогда как /
соответствует корню - и только корню - независимо от того, что является текущим узлом.
Обратите внимание, что корень НЕ является корневым элементом XML, это фактически уровень над ним - корневой элемент является дочерним для корня.
Если у вас есть этот XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/|*">
<item name="{name()}">
<xsl:apply-templates/>
</item>
</xsl:template>
</xsl:stylesheet>
и вы применяете его к этому XML:
<rootElement>
<subElement1/>
<subElement2/>
</rootElement>
Вы получите это:
<item name="">
<item name="rootElement">
<item name="subElement1" />
<item name="subElement2" />
</item>
</item>
первые <item name="">
соответствуют совпадению /
(которое не является элементом и поэтому не имеет имени), остальные - совпадения *
.