【问题标题】:XSLT 1.0 - Create a Unique, Ordered ListXSLT 1.0 - 创建唯一的有序列表
【发布时间】:2013-05-01 23:33:45
【问题描述】:

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

我有来源

<?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>

并且想要输出(按“名称”排序)

:: Blue - Hat
:: Red - Car

XLST - 目前不返回任何内容(我知道它也缺少第二个连字符/连接值)

<?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 list xslt unique


    【解决方案1】:

    你在正确的轨道上。您的 xsl:for-each 选择的 XPath 中有一个 type-o:/results/results 应该是 /results/result。我对匹配和使用的键进行了微调。

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

    <?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>
    

    【讨论】:

    • 感谢麦兹!太完美了。
    • 另外,为了争论,我可以使用现有的 concat 添加到 Author 的超链接吗? &lt;xsl:value-of select="concat(Name, ' - ','&lt;a title="',Author,'" href="http://www.test.com/',Author,'&gt;contact us&lt;/a&gt;')"/&gt;这对我不起作用。
    • 不,concat() 连接字符串。在这种情况下,您要创建一个a 元素。你会想做这样的事情:&lt;xsl:value-of select="Name"/&gt; &lt;xsl:text&gt; - &lt;/xsl:text&gt; &lt;a href="http://www.test.com/{Author}"&gt;&lt;xsl:value-of select="Author"/&gt;&lt;/a&gt;
    猜你喜欢
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多