Вот два разных решения : простое и более сложное, которое производит только уникальные страны:
0,1. Получить все Country
элементов:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(self::Country)]">
<xsl:apply-templates select="*"/>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному XML-документу, получается требуемый, правильный результат :
<Country>Germany</Country>
<Country>Mexico</Country>
0,2. Найти все уникальные страны :
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kCountryByVal" match="Country" use="."/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/*/Country[generate-id()
=
generate-id(key('kCountryByVal',.)[1])
]
"/>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к любому документу XML со структурой предоставленного документа, где некоторые элементы Country
могут иметь одинаковое значение, создается только один элемент Country
для каждого другого значения .
С предоставленным XML-документом мы все равно получаем тот же результат:
<Country>Germany</Country>
<Country>Mexico</Country>