嵌套XSL for-each语句的难度

时间:2015-03-27 15:16:27

标签: xml xslt foreach nested muenchian-grouping

我是XSL的新手并且在我的头脑上工作了一段时间。

我有一个xml文件(如下所示),我希望按月和年分组。我用Muenchian Grouping实现了这一点......但是这导致了围绕嵌套for-each语句的新问题。

问题是所有链接现在只指向数组中的第一个链接,而不是它们自己的链接。

在我的XML下面是XSL,它有两个由///

分隔的主体语句

第一个是我的分组逻辑和不正确的链接。最初被注释掉的较低的一个是我在分组之前的声明,它具有正确运行的链接。

如果有人能帮助我重构我的逻辑,那将非常感激。我接近完成了!

XML:

<?xml version="1.0" encoding="UTF-8"?>
-<rss version="2.0">-
 <channel>
  <title>Company Name</title>
  <description>Company News and Events</description>
  <link>http://brattle.com/</link>
    <item>
      <title>Paul Hinton and Pavitra Kumar to Speak at High-Frequency Trading Litigation Webinar</title>
      <description><p>Brattle principal Paul Hinton and senior associate Pavitra Kumar will present in the upcoming webinar, &ldquo;High-Frequency Trading Litigation in 2015,&rdquo; hosted by The Knowledge Group on March 26, 2015 from 3:00 pm – 5:00 pm EST.</p><p>This webcast will discuss issues surrounding High-Frequency Trading (HFT), which in recent years has increased and become a focus of regulators. The Joint Commodity Futures Trading Commission (CFTC)-Securities and Exchange Commission (SEC) Advisory Committee has expressed concern over the volume of orders and cancellations of trades (spoofing), and the SEC, CFTC, and the FBI have all announced investigations of HFT practices. Panelists will address how HFT will continue to create challenging analytical and legal issues involving its complexity and multi-party nature of trading, changing regulation, and new legal theories.</p><p>Dr. Kumar will speak on the &ldquo;Key Areas of High-Frequency-Trading-Related Litigation and Related Economic Issues,&rdquo; including exchange-related litigation, litigation against HFT firms, and market access litigation. Mr. Hinton will speak on the latest issues surrounding HFT litigation in light of the continued scrutiny by regulators placed on financial firms.</p><p>For more information on the webinar, or to register, please visit the <a href="http://theknowledgegroup.org/event_name/high-frequency-trading-litigation-in-2015-explored-live-webcast/">website</a>.</p></description>
      <pubDate>26 Mar 2015</pubDate>
      <link>http://brattle.com/news-and-knowledge/events/813</link>
      <guid>http://brattle.com/news-and-knowledge/events/813</guid>
    </item>
    <item>
      <title>Bruce Tsuchida to Present at Upcoming LSI Conference on Transmission in the Northeast</title>
      <description><p>Brattle principal Bruce Tsuchida has been selected to present at the upcoming Law Seminars International (LSI) conference, &ldquo;Transmission in the Northeast: Legal, Business and Regulatory Developments,&rdquo; taking place March 19-20, 2015 in Boston, MA.</p><p>Participants in this event will include attorneys, industry executives, government officials, and customer representatives involved with electric generation and transmission. The conference will examine the issues surrounding transmission and distributed system technology and policy, along with the regulatory changes that are affecting expansion, coordination, and planning efforts.</p><p>Mr. Tsuchida will participate in the panel session, &ldquo;How Greater Reliance on Distributed Resources Affects Distribution and Transmission.&rdquo;</p><p>To learn more about the event, or to register, visit the LSI <a href="http://www.lawseminars.com/detail.php?SeminarCode=15ETRANMA">website</a>.</p></description>
      <pubDate>19 Mar 2015</pubDate>
      <link>http://brattle.com/news-and-knowledge/events/814</link>
      <guid>http://brattle.com/news-and-knowledge/events/814</guid>
    </item>
    <item>
      <title>Deploying Up to 5,000 MW of Grid-Integrated Electricity Storage in Texas Could Provide Substantial Net Benefits According to Brattle Economists</title>
      <description><p>A report recently released by Brattle economists finds that the deployment of grid-integrated distributed electricity storage in Texas could provide substantial net benefits to the power system in ERCOT and its electricity customers. The report, commissioned by Oncor Electric Delivery Company, a Transmission and Distribution Service Provider (TDSP) in Texas, evaluates whether storage could be cost-effectively deployed from the perspectives of retail customers, wholesale electricity market participants, and the combined system or &ldquo;society as a whole&rdquo; while maintaining wholesale power prices that continue to support necessary generation investments. The recently released report is a follow-up to preliminary results released in November 2014.</p><p>The Brattle report estimates that 3,000 to 5,000 MW of grid-integrated, distributed electricity storage would be the most cost-effective from an ERCOT system-wide societal perspective based on a forecast of installed cost of storage of approximately $350/kWh. The authors identify four components of storage value from a system-wide perspective to estimate net benefits, including avoided distribution outages, deferred transmission and distribution (T&D) investment, avoided new generation or demand-side capacity investments, and electricity production cost savings. From an electricity customer&rsquo;s perspective, deploying storage across ERCOT would decrease customer bills slightly and additionally provide significant reliability benefits in the form of reduced power outages for customers located in areas where storage is installed.</p><p>&ldquo;Considering both the impact on electricity bills and improved reliability of grid-integrated storage, the customer benefits would significantly exceed costs,&rdquo; said Judy Chang, a Brattle principal and lead author of the study. &ldquo;However, while beneficial from an integrated, system-wide perspective, an efficient scale of storage deployment would not be reached if deployed by merchant developers who rely solely on participation in the wholesale market, or by retail customers who use it solely for back-up power, or by wires companies who deploy it solely for capturing T&D benefits. These entities, independently and separately, will not be able to capture the full value of the storage to viably support the magnitude of investment that could be cost-effective for ERCOT.&rdquo;</p><p>The authors show that enabling cost-effective investments in electricity storage will require a regulatory framework that helps investors capture the combined values of storage from the wholesale market, the T&D systems, and customer outage reduction. Thus, the authors recommend a regulatory framework that would involve allowing the transmission and distribution companies to deploy the electricity storage on the distribution system and &ldquo;auction off&rdquo; to independent third parties the rights to use the storage facilities for participation in the wholesale market.</p><p>&ldquo;The Value of Distributed Electricity Storage in Texas: Proposed Policy for Enabling Grid-Integrated Storage Investments,&rdquo; is authored by Ms. Chang, Johannes Pfeifenberger, Kathleen Spees, and Matthew Davis, with the support of Brattle research analysts. It is available for download below.</p></description><pubDate>13 Mar 2015</pubDate>
      <link>http://brattle.com/news-and-knowledge/news/808</link>
      <guid>http://brattle.com/news-and-knowledge/news/808</guid>
    </item>
  </channel>
</rss>

XSL:

<xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema"
           version="1.0" exclude-result-prefixes="xsl ddwrt msxsl rssaggwrt"
           xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
           xmlns:rssaggwrt="http://schemas.microsoft.com/WebParts/v3/rssagg/runtime"
           xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
           xmlns:rssFeed="urn:schemas-microsoft-com:sharepoint:RSSAggregatorWebPart">

<xsl:param name="rss_FeedLimit">30</xsl:param>
<xsl:param name="rss_ExpandFeed">true</xsl:param>
<xsl:param name="rss_LCID">1033</xsl:param>
<xsl:param name="rss_WebPartID">RSS_Viewer_WebPart</xsl:param>
<xsl:param name="rss_alignValue">left</xsl:param>
<xsl:param name="rss_IsDesignMode">True</xsl:param>



<!--////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////-->



<xsl:key name="item-pubDate" match="item" use="substring(pubDate,3,9)" />
<xsl:template match="channel">
<xsl:variable name="Rows" select="channel/item"/>
<xsl:variable name="RowCount" select="count($Rows)"/>
<xsl:variable name="item_link" select="item/link"/>
<xsl:variable name="item_title" select="description"/>

<xsl:for-each select="$Rows"/>
<xsl:variable name="CurPosition" select="position()" />
<xsl:variable name="PrevPosition" select="position()-1" />
<xsl:variable name="RssFeedLink" select="$rss_WebPartID" />
<xsl:variable name="CurrentElement" select="concat($RssFeedLink,$CurPosition)" />

<xsl:for-each select ="item[count(. | key('item-pubDate', substring(pubDate,3,9))[1]) = 1]">
 <div align="center">
    <hr/>
  <xsl:value-of select="substring(pubDate,3,9)" />
 </div>
 <xsl:for-each select="key('item-pubDate', substring(pubDate,3,9))">
   <!--<xsl:sort select="pubDate" order="descending"/>-->
   <li>
     <xsl:for-each select="$Rows"/>
        <a href="{$item_link}" title="{$item_title}">
          <xsl:variable name="SafeHtml">
            <xsl:call-template name="GetSafeHtml">
              <xsl:with-param name="Html" select="title"/>
            </xsl:call-template>
          </xsl:variable>
          <xsl:value-of select="$SafeHtml" disable-output-escaping="yes"/>
        </a>
     <!--</xsl:for-each>-->
  </li>
 </xsl:for-each>
</xsl:for-each>
</xsl:template>



<!--////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////-->



 <!--<xsl:template match="item">
  <xsl:variable name="Rows" select="channel/item"/>
  <xsl:variable name="RowCount" select="count($Rows)"/>
  <xsl:variable name="item_link" select="link"/>
  <xsl:variable name="item_title" select="description"/>

  <xsl:for-each select="$Rows"/>
  <xsl:variable name="CurPosition" select="position()" />
  <xsl:variable name="PrevPosition" select="position()-1" />
  <xsl:variable name="RssFeedLink" select="$rss_WebPartID" />
  <xsl:variable name="CurrentElement" select="concat($RssFeedLink,$CurPosition)" />
  <xsl:if test="not(substring(pubDate,3,9) = 0)">
    <div align="center">
      <hr/>
      <xsl:value-of select="substring(pubDate,3,9)" disable-output-escaping="yes"/>
    </div>
  </xsl:if>
  <li>
    <a href="{$item_link}" title="{$item_title}">
      <xsl:variable name="SafeHtml">
        <xsl:call-template name="GetSafeHtml">
          <xsl:with-param name="Html" select="title"/>
        </xsl:call-template>
      </xsl:variable>
      <xsl:value-of select="$SafeHtml" disable-output-escaping="yes"/>
    </a>
  </li>
</xsl:template>-->



<!--////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////-->



<xsl:template name="GetSafeHtml">
<xsl:param name="Html"/>
<xsl:choose>
  <xsl:when test="$rss_IsDesignMode = 'True'">
    <xsl:value-of select="$Html"/>
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="rssaggwrt:MakeSafe($Html)"/>
  </xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

由于此要求的性质,我留下了网址等。我信任你,互联网。

哈哈,非常感谢任何帮助,在此期间我会继续摆弄我的筑巢

1 个答案:

答案 0 :(得分:1)

参考,如果我从上一个问题中略微调整了XML输入:

<强> XML

<rss version="2.0">
<channel>
  <title>Company Name</title>
  <description>Company News and Events</description>
  <link>http://website.com/</link>
  <item>
    <title>Article 1</title>
      <description><p>Something</p></description>
      <pubDate>12 Jan 2015</pubDate>
      <link>http://website.com/news-and-knowledge/news/807</link>
      <guid>http://website.com/news-and-knowledge/news/807</guid>
  </item>
  <item>
    <title>Article 2</title>
      <description><p>Something</p></description>
      <pubDate>20 Dec 2014</pubDate>
      <link>http://website.com/news-and-knowledge/news/806</link>
      <guid>http://website.com/news-and-knowledge/news/806</guid>
  </item>
  <item>
    <title>Article 3</title>
      <description><p>Something</p></description>
      <pubDate>09 Dec 2014</pubDate>
      <link>http://website.com/news-and-knowledge/news/805</link>
      <guid>http://website.com/news-and-knowledge/news/805</guid>
  </item>
  </channel>
</rss>

并应用以下样式表:

XSLT 1.0

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

<xsl:key name="item-by-month" match="item" use="substring(pubDate, 4)" />

<xsl:template match="/rss">
    <div>
        <xsl:apply-templates select="channel"/>
    </div>
</xsl:template>

<xsl:template match="channel">
    <!-- channel title -->
    <h2><xsl:value-of select="title"/></h2>
    <!-- for each distinct month -->
    <xsl:for-each select="item[count(. | key('item-by-month', substring(pubDate, 4))[1]) = 1]">
        <!-- month title -->
        <h3><xsl:value-of select="substring(pubDate, 4)"/></h3>
        <ul>
            <!-- list the items in this month -->
            <xsl:apply-templates select="key('item-by-month', substring(pubDate, 4))"/>
        </ul>
    </xsl:for-each>
</xsl:template>

<xsl:template match="item">
    <li>
        <a href="{link}" title="{title}">
            <xsl:value-of select="title"/>
        </a>
    </li>
</xsl:template>

</xsl:stylesheet>

结果将是:

<div>
   <h2>Company Name</h2>
   <h3>Jan 2015</h3>
   <ul>
      <li>
         <a href="http://website.com/news-and-knowledge/news/807" title="Article 1">Article 1</a>
      </li>
   </ul>
   <h3>Dec 2014</h3>
   <ul>
      <li>
         <a href="http://website.com/news-and-knowledge/news/806" title="Article 2">Article 2</a>
      </li>
      <li>
         <a href="http://website.com/news-and-knowledge/news/805" title="Article 3">Article 3</a>
      </li>
   </ul>
</div>

呈现为:

enter image description here

如果您有任何代码,请确保您有充分的理由。

还要注意pubDate使用&#34; dd-mmm-yyy&#34; (即天数填充为两位数)格式。