如何使用xslt显示重复的属性值

时间:2014-12-18 11:45:57

标签: xml xslt xslt-1.0 xslt-2.0

我是xslt的新手,我想请求帮助创建一个.xsl文件,该文件将验证属性值是否具有相同的值。

<catalog>
    <book id="bk101">aa</book>
    <book id="bk102">bb</book>
    <book id="bk103">cc</book>
    <book id="bk101">dd</book>
</catalog>

选择&#39; @ id&#39;的值与其他&#39; @ id&#39;值不同,它将显示: aa bb cc dd 另一方面,它会显示:

你的&#39; @ id&#39;具有相同的值&#39; bk101&#39;

1 个答案:

答案 0 :(得分:2)

以下样式表:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="book-by-id" match="book" use="@id" />

<xsl:template match="/catalog">
    <xsl:copy>
        <xsl:apply-templates select="book"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="book">
    <xsl:copy>
        <xsl:copy-of select="@id"/>
        <xsl:choose>
            <xsl:when test="count(key('book-by-id', @id)) > 1">
                <xsl:text>*** DUPLICATE ID ***</xsl:text>
            </xsl:when>
            <xsl:otherwise>
                <xsl:apply-templates/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

应用于您的示例输入时,将返回:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
   <book id="bk101">*** DUPLICATE ID ***</book>
   <book id="bk102">bb</book>
   <book id="bk103">cc</book>
   <book id="bk101">*** DUPLICATE ID ***</book>
</catalog>