Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT 1.0-创建唯一的有序列表_Xml_List_Xslt_Unique - Fatal编程技术网

Xml XSLT 1.0-创建唯一的有序列表

Xml XSLT 1.0-创建唯一的有序列表,xml,list,xslt,unique,Xml,List,Xslt,Unique,我试图创建一个转换,在其中生成一个有序的唯一列表(其中一个连字符分隔两个值) 我有消息来源 <?xml version="1.0"?> <results> <result> <Name>Blue</Name> <Author>Hat</Author> <TrackNum>5</TrackNum> </result>

我试图创建一个转换,在其中生成一个有序的唯一列表(其中一个连字符分隔两个值)

我有消息来源

<?xml version="1.0"?>
<results>
    <result>
        <Name>Blue</Name>
        <Author>Hat</Author>
        <TrackNum>5</TrackNum>
    </result>
    <result>
        <Name>Red</Name>
        <Author>Car</Author>
        <TrackNum>2</TrackNum>
    </result>
    <result>
        <Name>Blue</Name>
        <Author>Hat</Author>
        <TrackNum>345</TrackNum>
    </result>
</results>
XLST-当前不返回任何内容(我知道它也缺少第二个连字符/连接的值)



  • 您的方法是正确的。您的xsl:for每个select的XPath中都有一个o类型:
    /results/results
    应该是
    /results/result
    。我对该键进行了轻微调整,以确定它匹配和使用的内容

    下面生成一个唯一的姓名和作者组合列表,按
    姓名
    排序,然后按
    作者
    排序

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet
        version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    
        <xsl:key name="Name-Author" match="results/result" use="concat(Name, ' - ', Author)" />
    
        <xsl:template match="/">
    
            <xsl:for-each select="/results/result[generate-id()
                = generate-id(key('Name-Author',concat(Name, ' - ', Author))[1])]">
                <xsl:sort select="Name"/>
                <xsl:sort select="Author"/>
                <li>
                    <xsl:value-of select="concat(Name, ' - ', Author)"/>
                </li>
            </xsl:for-each>
    
        </xsl:template>
    
    </xsl:stylesheet>
    
    
    

  • 谢谢Mads!太好了。另外,为了便于讨论,我可以使用现有的concat向Author添加一个超链接吗?
    这对我不起作用。不,
    concat()
    连接字符串。在这种情况下,您需要创建一个
    元素
    。您需要执行以下操作:
    -
    <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet
       version="1.0"
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    
    <xsl:key name="Name" match="/results/result/Name/text()" use="." />
    
    <xsl:template match="/">
    
      <xsl:for-each select="/results/results/Name/text()[generate-id()
                                           = generate-id(key('Name',.)[1])]">
        <li>
          <xsl:value-of select="."/>
        </li>
      </xsl:for-each>
    
    </xsl:template>
    
    </xsl:stylesheet>
    
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet
        version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    
        <xsl:key name="Name-Author" match="results/result" use="concat(Name, ' - ', Author)" />
    
        <xsl:template match="/">
    
            <xsl:for-each select="/results/result[generate-id()
                = generate-id(key('Name-Author',concat(Name, ' - ', Author))[1])]">
                <xsl:sort select="Name"/>
                <xsl:sort select="Author"/>
                <li>
                    <xsl:value-of select="concat(Name, ' - ', Author)"/>
                </li>
            </xsl:for-each>
    
        </xsl:template>
    
    </xsl:stylesheet>