如何丢弃节点与使用xslt的xml中的早期节点具有相同的值

时间:2014-11-05 12:00:04

标签: xml xslt-1.0

我的xml如下:



<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="document-library-filter.xsl"?>
<xml total="14">
    <document>
        
        <file_type><![CDATA[application/pdf]]></file_type>
        <file_size><![CDATA[4420 KB]]></file_size>
        <document_group><![CDATA[LED Systems 1]]></document_group>
        
    </document>
    <document>
        
        <file_type><![CDATA[application/pdf]]></file_type>
        <file_size><![CDATA[4420 KB]]></file_size>
        <document_group><![CDATA[LED Systems 1]]></document_group>
        
</xml>
&#13;
&#13;
&#13;

它包含多个文档节点。每个文档节点都有文件类型节点。对于所有文档节点,value是pdf。 我想写出单个文件类型的节点。并丢弃其他节点,因为它们具有相同的值。 要做到这一点,我试着写出以下xslt。但它会写出所有节点。

以下是xslt:

&#13;
&#13;
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
    <hr class="grid-hr inner-grid"/>
    <fieldset>
        <legend>%%filter-file-types%%:</legend>
        <ul class="itembrowser-filter">
            <xsl:for-each select="xml/document">
                <xsl:if test="file_type">
                    <xsl:variable name="file_type">
                        <xsl:value-of select="file_type"/>
                    </xsl:variable>
                    <xsl:variable name="file_type_Value">
                        <xsl:value-of select="substring-after($file_type,'/')"/>
                    </xsl:variable>
                    <li>
                        <label>
                            <input type="checkbox" 
                                   class="input-big-checkbox" 
                                   name="filetype-filter" 
                                   value="{$file_type}"/>
                            <span class="label">
                                <xsl:copy-of select="$file_type_Value"/>
                            </span>
                        </label>
                    </li>
                </xsl:if>
            </xsl:for-each>
        </ul>
    </fieldset>
    <hr class="grid-hr inner-grid"/>
</xsl:template>
</xsl:stylesheet>
&#13;
&#13;
&#13;

我需要某种方法来比较两个节点值,如果它们相同,那么它只会写出一次。

我的预期输出是:

&#13;
&#13;
<fieldset>
<legend>%%filter-file-types%%:</legend>
<ul class="itembrowser-filter">
    <li>
        <label>
            <input type="checkbox" 
                   class="input-big-checkbox" 
                   name="filetype-filter" 
                   value="application/pdf"/>
            <span class="label">
                <xsl:copy-of select="pdf"/>
            </span>
        </label>
    </li>
</ul>
</fieldset>
&#13;
&#13;
&#13;

我无法做到这一点。请帮帮我。

1 个答案:

答案 0 :(得分:0)

您的样式表会遍历所有document元素,因此会为每个元素输出fieldset

此模板产生预期的输出:

<xsl:template match="//file_type[not(.=preceding::file_type)]">
  <fieldset>
    <legend>%%filter-file-types%%:</legend>
    <ul class="itembrowser-filter">
      <li>
        <label>
          <input type="checkbox" class="input-big-checkbox" name="filetype-filter" value="{.}"/>
          <span class="label">
            <xsl:value-of select="substring-after(.,'/')"/>
          </span>
        </label>
      </li>
    </ul>
  </fieldset>
</xsl:template>

模板与所有file_type元素的第一个file_type元素匹配,但值相同。