在XSLT 1.0中构建属性时如何避免重复?

时间:2018-06-21 07:45:54

标签: xml xslt-1.0

XML文件包含未指定数量的未排序元素,其属性为“ art”。对于每个不同的“艺术品”属性,应在属性“关键字”中准确输入一个值,以逗号分隔。

xml提取

...
<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示例为每个属性创建一个列表条目,无论是否已经输入它。

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中寻找一种有效的方法,该方法可以避免多次输入,并且在必要时可以扩展为其他属性。

1 个答案:

答案 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方法。