XML文件包含未指定数量的未排序元素,其属性为“ art”。对于每个不同的“艺术品”属性,应在属性“关键字”中准确输入一个值,以逗号分隔。
...
<records art="abc"/>
<records art="cba"/>
<records art="abc"/>
<records art="bac"/>
<records art="bac"/>
<records art="abc"/>
...
<meta name="keywords" content="abc,cba,bac"/>
XSLT示例为每个属性创建一个列表条目,无论是否已经输入它。
...
<meta name="keywords">
<xsl:attribute name="content">
<xsl:for-each select="records">
<xsl:value-of select="@art"/>
<xsl:if test="position() != last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:attribute>
</meta>
...
我正在XSLT 1.0中寻找一种有效的方法,该方法可以避免多次输入,并且在必要时可以扩展为其他属性。
答案 0 :(得分:1)
特别感谢Michael Kay(https://www.saxonica.com/)的提示。
<meta name="keywords">
<xsl:attribute name="content">
<xsl:for-each select="//records[not(@art = preceding-sibling::records/@art)]">
<xsl:value-of select="@art"/>
<xsl:if test="position() != last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:attribute>
</meta>
此解决方案是O(n²)。在较大的节点集上,最好使用Muenchian方法。