Чтобы упростить поиск значений полей, вы можете определить ключ.
<xsl:key name="field" match="Person/*" use="local-name()" />
Затем вам просто нужно выбрать дочерние узлы первого элемента Person
и для каждого из них. используйте ключ для ввода значений ...
<xsl:for-each select="key('field', local-name())">
<xsl:if test="position() > 1">, </xsl:if>
<xsl:value-of select="." />
</xsl:for-each>
Попробуйте этот XSLT, который оставляет дубликаты в
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="field" match="Person/*" use="local-name()" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Person[1]/*">
<xsl:copy>
<xsl:for-each select="key('field', local-name())">
<xsl:if test="position() > 1">, </xsl:if>
<xsl:value-of select="." />
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="Person[position() > 1]" />
</xsl:stylesheet>
Если вы действительно хотите удалить дубликаты, вам нужно будет использоватьМюнхенская группировка. Это означает объявление второго ключа
<xsl:key name="fieldAndValue" match="Person/*" use="concat(local-name(), ':', .)" />
И для получения различных значений измените xsl:for-each
следующим образом:
<xsl:for-each select="key('field', local-name())[generate-id() = generate-id(key('fieldAndValue', concat(local-name(), ':', .))[1])]">
Попробуйте этот XSLT тоже
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="field" match="Person/*" use="local-name()" />
<xsl:key name="fieldAndValue" match="Person/*" use="concat(local-name(), ':', .)" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Person[1]/*">
<xsl:copy>
<xsl:for-each select="key('field', local-name())[generate-id() = generate-id(key('fieldAndValue', concat(local-name(), ':', .))[1])]">
<xsl:if test="position() > 1">, </xsl:if>
<xsl:value-of select="." />
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="Person[position() > 1]" />
</xsl:stylesheet>
Конечно, если бы вы могли использовать XSLT 2.0, вы могли бы сделать это намного проще ...
<xsl:template match="Person[1]/*">
<xsl:copy>
<xsl:value-of select="distinct-values(key('field', local-name()))" separator=", " />
</xsl:copy>
</xsl:template>
РЕДАКТИРОВАТЬ : Если вы не можете использовать xsl:key
, измените xsl:for-each
(в первом XSLT, который не удаляет дубликаты) к этому ....
<xsl:for-each select="//Person/*[local-name() = local-name(current())]">
При этом сохраняются дубликаты. Удаление дубликатов без ключа возможно, но, вероятно, слишком много проблем, чем стоит ....