home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / WindowsServerTrial / server.iso / sources / install.wim / 1 / Windows / System32 / msfeeds.dll / HTML / ATOM03NORMALIZER.XSL next >
Text File  |  2008-01-19  |  21KB  |  391 lines

  1. <xsl:stylesheet version="1.0" 
  2.   xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  3.   xmlns:atom="http://www.w3.org/2005/Atom"
  4.   xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005"
  5.   xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  6.   xmlns:atom03="http://purl.org/atom/ns#"
  7.   xmlns:msfeednorm="urn:microsoft:feed-normalization"
  8.   exclude-result-prefixes="sy atom03 msfeednorm"
  9.   >
  10.  
  11. <!-- Shared templates -->
  12.   <xsl:import href="res://msfeeds.dll/SharedNormalizer.xsl" />
  13.  
  14. <!-- Output XML UTF-8 -->
  15.   <xsl:output method="xml" encoding="utf-8" />
  16.   
  17. <!-- Entry point -->
  18.   <xsl:template match="/atom03:feed">
  19.     <rss version="2.0">
  20.       <channel>
  21.  
  22.         <xsl:call-template name="_OutputXmlBase"><xsl:with-param name="value" select="@xml:base" /></xsl:call-template>
  23.         <xsl:call-template name="_OutputXmlLang"><xsl:with-param name="value" select="@xml:lang" /></xsl:call-template>
  24.         <xsl:call-template name="_OutputLanguage"><xsl:with-param name="value" select="@xml:lang" /></xsl:call-template>
  25.  
  26.         <!-- Figure out the base URL value; xml:base overrides the download URL -->
  27.         <xsl:variable name="baseChannelUrl">
  28.           <xsl:call-template name="_GetFeedBaseUrl">
  29.             <xsl:with-param name="downloadUrl" select="$downloadUrl" />
  30.             <xsl:with-param name="rootNode" select="." />
  31.           </xsl:call-template>
  32.         </xsl:variable>
  33.  
  34.         <!-- Try to find the main link - one that has an href pointing to html and with type alternate -->
  35.         <xsl:variable name="mainLink" select="atom03:link[(@rel = 'alternate' or @rel = '' or not(@rel)) and (@type = 'text/html' or @type = '' or not(@type))]" />
  36.  
  37.         <!-- Output link -->
  38.         <xsl:if test="$mainLink">
  39.           <!-- Combine base URL with the main link -->
  40.           <xsl:variable name="channelLinkUrl">
  41.             <xsl:call-template name="_CompleteUrlTwoBase">
  42.               <xsl:with-param name="baseUrl1" select="$baseChannelUrl" />
  43.               <xsl:with-param name="baseUrl2" select="$mainLink/@xml:base" />
  44.               <xsl:with-param name="Url" select="$mainLink/@href" />
  45.             </xsl:call-template>
  46.           </xsl:variable>
  47.           <xsl:call-template name="_OutputLink"><xsl:with-param name="value" select="$channelLinkUrl" /></xsl:call-template>
  48.         </xsl:if>
  49.  
  50.         <!-- Build a list of referenced nodes from cf:sort and cf:group -->
  51.         <xsl:variable name="cfReferences">
  52.           <xsl:call-template name="_BuildCfReferenceList"><xsl:with-param name="value" select="." /></xsl:call-template>
  53.         </xsl:variable>
  54.  
  55.         <!-- Process channel elements -->
  56.         <xsl:apply-templates select="*" mode="channel">
  57.           <xsl:with-param name="baseChannelUrl" select="$baseChannelUrl" />
  58.         </xsl:apply-templates>
  59.  
  60.         <!-- Process items -->
  61.         <xsl:apply-templates select="atom03:entry">
  62.           <xsl:with-param name="baseChannelUrl" select="$baseChannelUrl" />
  63.           <xsl:with-param name="references" select="$cfReferences" />
  64.         </xsl:apply-templates>
  65.  
  66.       </channel>
  67.     </rss>
  68.   </xsl:template>
  69.  
  70. <!-- Channel processing -->
  71.   <xsl:template match="*" mode="channel">
  72.     <xsl:param name="baseChannelUrl" />
  73.     <xsl:variable name="isFirst">
  74.       <xsl:call-template name="_IsFirstChildOfItsKind"><xsl:with-param name="value" select="." /></xsl:call-template>
  75.     </xsl:variable>
  76.     <xsl:choose>
  77.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'title' and $isFirst = 'true'">
  78.         <xsl:call-template name="_OutputTitle">
  79.           <xsl:with-param name="value" select="." />
  80.           <xsl:with-param name="type" select="@type" />
  81.         </xsl:call-template>
  82.       </xsl:when>
  83.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'author'">
  84.         <!-- First one gets converted to managing Editor -->
  85.         <xsl:if test="$isFirst = 'true'">
  86.           <xsl:variable name="manEditor">
  87.             <xsl:call-template name="_ConvertAtomAuthorToAuthor">
  88.               <xsl:with-param name="name" select="atom03:name" />
  89.               <xsl:with-param name="email" select="atom03:email" />
  90.             </xsl:call-template>
  91.           </xsl:variable>
  92.           <xsl:call-template name="_OutputManagingEditor"><xsl:with-param name="value" select="$manEditor" /></xsl:call-template>
  93.         </xsl:if>
  94.         <!-- Map to Atom 1.0 -->
  95.         <xsl:call-template name="_OutputAtomAuthor">
  96.           <xsl:with-param name="name" select="atom03:name" />
  97.           <xsl:with-param name="email" select="atom03:email" />
  98.           <xsl:with-param name="uri" select="atom03:url" />
  99.         </xsl:call-template>
  100.       </xsl:when>
  101.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'contributor'">
  102.         <!-- Map to Atom 1.0 -->
  103.         <xsl:call-template name="_OutputAtomContributor">
  104.           <xsl:with-param name="name" select="atom03:name" />
  105.           <xsl:with-param name="email" select="atom03:email" />
  106.           <xsl:with-param name="uri" select="atom03:url" />
  107.         </xsl:call-template>
  108.       </xsl:when>
  109.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'tagline' and $isFirst = 'true'">
  110.         <xsl:call-template name="_OutputTextDescription">
  111.           <xsl:with-param name="value" select="." />
  112.           <xsl:with-param name="type" select="@type" />
  113.         </xsl:call-template>
  114.       </xsl:when>
  115.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'id' and $isFirst = 'true'">
  116.         <xsl:call-template name="_OutputGuid">
  117.           <xsl:with-param name="value" select="." />
  118.           <xsl:with-param name="isPermaLink" select="'false'" />
  119.           <xsl:with-param name="channelGuid" select="'true'" />
  120.         </xsl:call-template>
  121.       </xsl:when>
  122.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'generator' and $isFirst = 'true'">
  123.         <xsl:call-template name="_OutputGenerator">
  124.           <xsl:with-param name="value" select="." />
  125.           <xsl:with-param name="uri" select="@url" />
  126.           <xsl:with-param name="version" select="@version" />
  127.         </xsl:call-template>
  128.       </xsl:when>
  129.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'modified' and $isFirst = 'true'">
  130.         <xsl:call-template name="_OutputLastBuildDate"><xsl:with-param name="value" select="." /></xsl:call-template>
  131.         <xsl:variable name="updatedExists">
  132.           <xsl:choose>
  133.             <xsl:when test="../atom:updated">true</xsl:when>
  134.             <xsl:otherwise>false</xsl:otherwise>
  135.           </xsl:choose>
  136.         </xsl:variable>
  137.         <xsl:if test="$updatedExists = 'false'">
  138.           <xsl:call-template name="_OutputAtomUpdated"><xsl:with-param name="value" select="." /></xsl:call-template>
  139.         </xsl:if>
  140.       </xsl:when>
  141.       <xsl:when test="namespace-uri(.) = $_NSatom1 and local-name(.) = 'published'">
  142.  
  143.       </xsl:when>
  144.       <xsl:when test="namespace-uri(.) = $_NSatom1 and local-name(.) = 'updated'">
  145.         <xsl:if test="$isFirst = 'true'">
  146.           <xsl:call-template name="_OutputAtomUpdated"><xsl:with-param name="value" select="." /></xsl:call-template>
  147.           <xsl:if test="not(../atom03:modified)">
  148.             <xsl:call-template name="_OutputLastBuildDate"><xsl:with-param name="value" select="." /></xsl:call-template>
  149.           </xsl:if>
  150.         </xsl:if>
  151.       </xsl:when>
  152.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'copyright' and $isFirst = 'true'">
  153.         <xsl:call-template name="_OutputCopyright">
  154.           <xsl:with-param name="value" select="." />
  155.           <xsl:with-param name="type" select="@type" />
  156.         </xsl:call-template>
  157.       </xsl:when>
  158.       <xsl:when test="namespace-uri(.) = $_NSdc and local-name(.) = 'subject'">
  159.         <xsl:call-template name="_OutputCategory"><xsl:with-param name="value" select="." /></xsl:call-template>
  160.       </xsl:when>
  161.       <!-- First pair of updateFrequency and updatePeriod gets converted to ttl; all sy:* nodes are preserved as extensions -->
  162.       <xsl:when test="namespace-uri(.) = $_NSsy and local-name(.) = 'updatePeriod' and $isFirst = 'true'">
  163.         <xsl:if test="../sy:updateFrequency">
  164.           <xsl:call-template name="_ConvertUpdatesToTtl">
  165.             <xsl:with-param name="updatePeriod" select="string(.)" />
  166.             <xsl:with-param name="updateFrequency" select="string(../sy:updateFrequency)" />
  167.           </xsl:call-template>
  168.           <xsl:call-template name="_OutputExtension"><xsl:with-param name="value" select="." /></xsl:call-template>
  169.         </xsl:if>
  170.       </xsl:when>
  171.       <xsl:when test="namespace-uri(.) = $_NScf and local-name(.) = 'treatAs'">
  172.         <xsl:if test="$isFirst = 'true'">
  173.           <xsl:call-template name="_OutputCfTreatAs"><xsl:with-param name="value" select="." /></xsl:call-template>
  174.         </xsl:if>
  175.       </xsl:when>
  176.       <xsl:when test="namespace-uri(.) = $_NScf and local-name(.) = 'listinfo'">
  177.         <xsl:if test="$isFirst = 'true'">
  178.           <xsl:call-template name="_OutputCfListinfo"><xsl:with-param name="value" select="." /></xsl:call-template>
  179.         </xsl:if>
  180.       </xsl:when>
  181.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'entry'">
  182.         <!-- Do nothing here for items -->
  183.       </xsl:when>
  184.       <!-- Copy extension nodes -->
  185.       <xsl:when test="namespace-uri(.) != $_NSatom03 and namespace-uri(.) != ''">
  186.         <xsl:call-template name="_OutputExtension"><xsl:with-param name="value" select="." /></xsl:call-template>
  187.       </xsl:when>
  188.     </xsl:choose>
  189.   </xsl:template>
  190.  
  191. <!-- Item processing -->
  192.   <xsl:template match="atom03:entry">
  193.     <xsl:param name="baseChannelUrl" />
  194.     <xsl:param name="references" />
  195.     <item>
  196.  
  197.       <xsl:call-template name="_OutputXmlBase"><xsl:with-param name="value" select="@xml:base" /></xsl:call-template>
  198.  
  199.       <xsl:call-template name="_OutputXmlLang"><xsl:with-param name="value" select="@xml:lang" /></xsl:call-template>
  200.  
  201.       <!-- Item's base URL stacks onto channel's base URL -->
  202.       <xsl:variable name="baseChannelItemUrl">
  203.         <xsl:call-template name="_CombineUrls">
  204.           <xsl:with-param name="baseUrl" select="$baseChannelUrl" />
  205.           <xsl:with-param name="relUrl" select="@xml:base" />
  206.         </xsl:call-template>
  207.       </xsl:variable>
  208.  
  209.       <!-- Try to find the main link - one that has an href pointing to html and with type alternate -->
  210.       <xsl:variable name="mainLink" select="atom03:link[(@rel = 'alternate' or @rel = '' or not(@rel)) and (@type = 'text/html' or @type = '' or not(@type))]" />
  211.  
  212.       <!-- Output link -->
  213.       <xsl:if test="$mainLink">
  214.         <!-- Combine base URL with the main link -->
  215.         <xsl:variable name="itemLinkUrl">
  216.           <xsl:call-template name="_CompleteUrlTwoBase">
  217.             <xsl:with-param name="baseUrl1" select="$baseChannelItemUrl" />
  218.             <xsl:with-param name="baseUrl2" select="$mainLink/@xml:base" />
  219.             <xsl:with-param name="Url" select="$mainLink/@href" />
  220.           </xsl:call-template>
  221.         </xsl:variable>
  222.         <xsl:call-template name="_OutputLink"><xsl:with-param name="value" select="$itemLinkUrl" /></xsl:call-template>
  223.       </xsl:if>
  224.  
  225.       <xsl:apply-templates select="*" mode="item">
  226.         <xsl:with-param name="baseItemUrl" select="$baseChannelItemUrl" />
  227.         <xsl:with-param name="references" select="$references" />
  228.       </xsl:apply-templates>
  229.  
  230.     </item>
  231.   </xsl:template>
  232.  
  233.   <xsl:template match="*" mode="item">
  234.     <xsl:param name="baseItemUrl" />
  235.     <xsl:param name="references" />
  236.     <xsl:variable name="isFirst">
  237.       <xsl:call-template name="_IsFirstChildOfItsKind"><xsl:with-param name="value" select="." /></xsl:call-template>
  238.     </xsl:variable>
  239.     <xsl:choose>
  240.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'title' and $isFirst = 'true'">
  241.         <xsl:call-template name="_OutputTitle">
  242.           <xsl:with-param name="value" select="." />
  243.           <xsl:with-param name="type" select="@type" />
  244.         </xsl:call-template>
  245.       </xsl:when>
  246.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'link' and @rel = 'enclosure' and (@href or @length or @type)">
  247.         <xsl:variable name="enclosureUrl">
  248.           <xsl:call-template name="_CompleteUrlTwoBase">
  249.             <xsl:with-param name="baseUrl1" select="$baseItemUrl" />
  250.             <xsl:with-param name="baseUrl2" select="@xml:base" />
  251.             <xsl:with-param name="Url" select="@href" />
  252.           </xsl:call-template>
  253.         </xsl:variable>
  254.         <xsl:call-template name="_OutputEnclosure">
  255.           <xsl:with-param name="url" select="$enclosureUrl" />
  256.           <xsl:with-param name="length" select="@length" />
  257.           <xsl:with-param name="type" select="@type" />
  258.         </xsl:call-template>
  259.       </xsl:when>
  260.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'author'">
  261.         <xsl:variable name="author">
  262.           <xsl:call-template name="_ConvertAtomAuthorToAuthor">
  263.             <xsl:with-param name="name" select="atom03:name" />
  264.             <xsl:with-param name="email" select="atom03:email" />
  265.           </xsl:call-template>
  266.         </xsl:variable>
  267.         <xsl:call-template name="_OutputAuthor"><xsl:with-param name="value" select="$author" /></xsl:call-template>
  268.         <!-- Map to Atom 1.0 -->
  269.         <xsl:call-template name="_OutputAtomAuthor">
  270.           <xsl:with-param name="name" select="atom03:name" />
  271.           <xsl:with-param name="email" select="atom03:email" />
  272.           <xsl:with-param name="uri" select="atom03:url" />
  273.         </xsl:call-template>
  274.       </xsl:when>
  275.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'contributor'">
  276.         <!-- Map to Atom 1.0 -->
  277.         <xsl:call-template name="_OutputAtomContributor">
  278.           <xsl:with-param name="name" select="atom03:name" />
  279.           <xsl:with-param name="email" select="atom03:email" />
  280.           <xsl:with-param name="uri" select="atom03:url" />
  281.         </xsl:call-template>
  282.       </xsl:when>
  283.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'id' and $isFirst = 'true'">
  284.         <xsl:call-template name="_OutputGuid">
  285.           <xsl:with-param name="value" select="." />
  286.           <xsl:with-param name="isPermaLink" select="'false'" />
  287.         </xsl:call-template>
  288.       </xsl:when>
  289.       <xsl:when test="namespace-uri(.) = $_NSatom1 and local-name(.) = 'published'">
  290.         <xsl:if test="$isFirst = 'true'">
  291.           <xsl:call-template name="_OutputAtomPublished"><xsl:with-param name="value" select="." /></xsl:call-template>
  292.           <xsl:if test="not(../atom03:issued)">
  293.             <xsl:call-template name="_OutputPubDate"><xsl:with-param name="value" select="." /></xsl:call-template>
  294.           </xsl:if>
  295.         </xsl:if>
  296.       </xsl:when>
  297.       <xsl:when test="namespace-uri(.) = $_NSatom1 and local-name(.) = 'updated'">
  298.         <xsl:if test="$isFirst = 'true'">
  299.           <xsl:call-template name="_OutputAtomUpdated"><xsl:with-param name="value" select="." /></xsl:call-template>
  300.         </xsl:if>
  301.       </xsl:when>
  302.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'modified' and $isFirst = 'true'">
  303.         <xsl:if test="not(../atom:updated)">
  304.           <xsl:call-template name="_OutputAtomUpdated"><xsl:with-param name="value" select="." /></xsl:call-template>
  305.         </xsl:if>
  306.       </xsl:when>
  307.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'issued' and $isFirst = 'true'">
  308.         <xsl:call-template name="_OutputPubDate"><xsl:with-param name="value" select="." /></xsl:call-template>
  309.         <xsl:if test="not(../atom:updated) and not(../atom03:modified)">
  310.           <xsl:call-template name="_OutputAtomUpdated"><xsl:with-param name="value" select="." /></xsl:call-template>
  311.         </xsl:if>
  312.         <xsl:if test="not(../atom:published)">
  313.           <xsl:call-template name="_OutputAtomPublished"><xsl:with-param name="value" select="." /></xsl:call-template>
  314.         </xsl:if>
  315.       </xsl:when>
  316.       <xsl:when test="namespace-uri(.) = $_NSdc and local-name(.) = 'subject'">
  317.         <xsl:call-template name="_OutputCategory"><xsl:with-param name="value" select="." /></xsl:call-template>
  318.       </xsl:when>
  319.       <!-- Handle content: printable goes into description; non-printable is preserved -->
  320.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'content' and $isFirst = 'true'">
  321.           <xsl:if test="@type = '' or not(@type) or @type = 'text/plain' or @type = 'text/html' or @type = 'application/xhtml+xml'">
  322.             <xsl:variable name="baseContentUrl">
  323.               <xsl:call-template name="_CombineUrls">
  324.                 <xsl:with-param name="baseUrl" select="$baseItemUrl" />
  325.                 <xsl:with-param name="relUrl" select="@xml:base" />
  326.               </xsl:call-template>
  327.             </xsl:variable>
  328.             <xsl:call-template name="_OutputDescription">
  329.               <xsl:with-param name="value" select="." />
  330.               <xsl:with-param name="type" select="@type" />
  331.               <xsl:with-param name="baseUrl" select="$baseContentUrl" />
  332.             </xsl:call-template>
  333.           </xsl:if>
  334.       </xsl:when>
  335.       <!-- Handle summary: printable goes into description or atom:summary; non-printable is discarded -->
  336.       <xsl:when test="namespace-uri(.) = $_NSatom03 and local-name(.) = 'summary' and $isFirst = 'true'">
  337.         <xsl:if test="@type = '' or not(@type) or @type = 'text/plain' or @type = 'text/html' or @type = 'application/xhtml+xml'">
  338.           <xsl:variable name="baseContentUrl">
  339.             <xsl:call-template name="_CombineUrls">
  340.               <xsl:with-param name="baseUrl" select="$baseItemUrl" />
  341.               <xsl:with-param name="relUrl" select="@xml:base" />
  342.             </xsl:call-template>
  343.           </xsl:variable>
  344.           <xsl:choose>
  345.             <xsl:when test="not(../atom03:content[@type = '' or not(@type) or @type = 'text/plain' or @type = 'text/html' or @type = 'application/xhtml+xml'])">
  346.               <xsl:call-template name="_OutputDescription">
  347.                 <xsl:with-param name="value" select="." />
  348.                 <xsl:with-param name="type" select="@type" />
  349.                 <xsl:with-param name="baseUrl" select="$baseContentUrl" />
  350.               </xsl:call-template>
  351.             </xsl:when>
  352.             <xsl:otherwise>
  353.               <!-- Map to Atom 1.0 -->
  354.               <xsl:call-template name="_OutputAtomSummary">
  355.                 <xsl:with-param name="value" select="." />
  356.                 <xsl:with-param name="type" select="@type" />
  357.                 <xsl:with-param name="xmlBase" select="@xml:base" />
  358.                 <xsl:with-param name="baseUrl" select="$baseContentUrl" />
  359.               </xsl:call-template>
  360.             </xsl:otherwise>
  361.           </xsl:choose>
  362.         </xsl:if>
  363.       </xsl:when>
  364.       <xsl:when test="namespace-uri(.) = $_NSslash and local-name(.) = 'comments'">
  365.         <xsl:if test="$isFirst = 'true'">
  366.           <xsl:call-template name="_OutputSlashComments"><xsl:with-param name="value" select="." /></xsl:call-template>
  367.         </xsl:if>
  368.       </xsl:when>
  369.       <xsl:when test="namespace-uri(.) = $_NSwfw and (local-name(.) = 'commentRss' or local-name(.) = 'commentRSS')">
  370.         <xsl:if test="$isFirst = 'true'">
  371.           <xsl:variable name="commentRssUrl">
  372.             <xsl:call-template name="_CompleteUrlTwoBase">
  373.               <xsl:with-param name="baseUrl1" select="$baseItemUrl" />
  374.               <xsl:with-param name="baseUrl2" select="@xml:base" />
  375.               <xsl:with-param name="Url" select="." />
  376.             </xsl:call-template>
  377.           </xsl:variable>
  378.           <xsl:call-template name="_OutputWfwCommentRSS"><xsl:with-param name="value" select="$commentRssUrl" /></xsl:call-template>
  379.         </xsl:if>
  380.       </xsl:when>
  381.       <!-- Copy extension nodes -->
  382.       <xsl:when test="namespace-uri(.) != $_NSatom03 and namespace-uri(.) != ''">
  383.         <xsl:call-template name="_OutputExtension">
  384.           <xsl:with-param name="value" select="." />
  385.           <xsl:with-param name="references" select="$references" />
  386.         </xsl:call-template>
  387.       </xsl:when>
  388.     </xsl:choose>
  389.   </xsl:template>
  390.  
  391. </xsl:stylesheet>