<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>プログラミング：スクリプト</title><link>http://blogs.wankuma.com/shannon/category/1873.aspx</link><description>プログラミング：スクリプト</description><managingEditor>αετος / aetos</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>シャノン</dc:creator><title>cscript.exe で JavaScript をデバッグできない</title><link>http://blogs.wankuma.com/shannon/archive/2008/08/31/154837.aspx</link><pubDate>Sun, 31 Aug 2008 18:56:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/08/31/154837.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/154837.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/08/31/154837.aspx#Feedback</comments><slash:comments>30</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/154837.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/154837.aspx</trackback:ping><description>&lt;p&gt;どうも、スクリプト内で ActiveXObject を使って COM オブジェクトのインスタンスを作っているところで失敗しているらしい。 &lt;br&gt;レジストリに異常がなかろうかと、ProgID を探してみた&amp;#8230;ら、あった。じゃあ対応する CLSID は&amp;#8230;ない！？ &lt;br&gt;すわ再インストールかと思ったところで、俺は 64bit OS を使っているんだということに思い当った。 &lt;br&gt;HKCR\CLSID 以下にはなかった。では、HKCR\Wow6432Node\CLSID なら&amp;#8230;ありました。&lt;/p&gt; &lt;p&gt;つまりこう。 &lt;br&gt;俺の OS は 64bit なので、cscript.exe も 64bit 版。 &lt;br&gt;64bit OS で 32bit プロセスは動くが、64bit プロセスは 32bit DLL を読み込めないという制限がある。 &lt;br&gt;従って、C:\Windows\System32\cscript.exe （こいつは 64bit 版）の代わりに、C:\Windows\SysWow64\cscript.exe （こっちが 32bit 版。ああ紛らわしい）を明示的に実行してやればよかったと。 &lt;br&gt;単にコマンド プロンプトから cscript とだけ打つと前者が起動してしまうのですな。&lt;/p&gt; &lt;p&gt;これは、何か、32bit DLL をロードするスクリプトを含むようなファイルが関連付けされるときには注意しておかなければならないことだなぁ。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/154837.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>OPML から IE7 の共通フィードリストに RSS をインポートするスクリプト</title><link>http://blogs.wankuma.com/shannon/archive/2008/06/25/145474.aspx</link><pubDate>Wed, 25 Jun 2008 13:19:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/06/25/145474.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/145474.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/06/25/145474.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/145474.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/145474.aspx</trackback:ping><description>&lt;P&gt;Outlook 2007 のインポート機能だと、フォルダが1階層だけになっちゃうんですもの。&lt;BR&gt;こいつはフォルダ階層を維持して取り込みます。&lt;/P&gt;
&lt;P&gt;type=rss でない outline 要素をフォルダと認識します。&lt;BR&gt;type=include および type=link かつファイル名の末尾が .opml のものは再帰的に展開します。&lt;/P&gt;
&lt;P&gt;共通フィードリストは、フィード名と同じ名前のファイルを内部的に生成するので、ファイル名に使えない文字をフィード名にすると落ちます。&lt;BR&gt;そのため、フィード名のクリーンアップ処理も行っています。&lt;/P&gt;&lt;PRE class="code js" name="code"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-16&amp;quot; standalone=&amp;quot;yes&amp;quot; ?&amp;gt;
&amp;lt;job&amp;gt;
 &amp;lt;runtime&amp;gt;
  &amp;lt;description&amp;gt;OPML ファイルから Windows の共通フィード ストアにフィードをインポートします。&amp;lt;/description&amp;gt;
  &amp;lt;named name=&amp;quot;opml&amp;quot; helpstring=&amp;quot;インポートする OPML の URI&amp;quot; type=&amp;quot;string&amp;quot; required=&amp;quot;true&amp;quot;/&amp;gt;
  &amp;lt;example&amp;gt;例：import.wsf http://www.example.com/feeds.opml&amp;lt;/example&amp;gt;
 &amp;lt;/runtime&amp;gt;
 &amp;lt;script language=&amp;quot;JavaScript&amp;quot;&amp;gt;
&amp;lt;![CDATA[
String.prototype.startsWith = function( str )
{
 if ( this.length &amp;lt; str.length ) { return false; }
 return ( this.substring( 0, str.length ) == str );
};
String.prototype.endsWith = function( str )
{
 if( this.length &amp;lt; str.length ) { return false; }
 return ( this.substring( this.length - str.length ) == str );
};
function /* string */ getFeedTitle( /* string */ feedUri )
{
 var xmlDom = WScript.CreateObject( &amp;quot;Microsoft.XMLDOM&amp;quot; );
 xmlDom.async = false;
 xmlDom.load( feedUri );
 
 var docElt = xmlDom.documentElement;
 if( docElt.baseName == &amp;quot;RDF&amp;quot; &amp;amp;&amp;amp; docElt.namespaceURI == &amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot; )
 {
  // RSS 1.0
  var channel = docElt.selectSingleNode( &amp;quot;./channel&amp;quot; );
  if( channel.namespaceURI == &amp;quot;http://purl.org/rss/1.0/&amp;quot; )
  {
   return channel.selectSingleNode( &amp;quot;./title&amp;quot; ).text;
  }
 }
 else if( docElt.baseName == &amp;quot;rss&amp;quot; &amp;amp;&amp;amp; docElt.getAttribute( &amp;quot;version&amp;quot; ) == &amp;quot;2.0&amp;quot; )
 {
  // RSS 2.0
  var channel = docElt.selectSingleNode( &amp;quot;./channel&amp;quot; );
  return channel.selectSingleNode( &amp;quot;./title&amp;quot; ).text;
 }
 else
 {
  // Unknown format
 }
 
 return null;
}
function /* string */ cleanupFileName( /* string */ fileName )
{
 fileName = fileName.replace( /[\x00-\x19]/, &amp;quot; &amp;quot; );
 fileName = fileName.replace( &amp;quot;\\&amp;quot;, &amp;quot;￥&amp;quot; );
 fileName = fileName.replace( &amp;quot;/&amp;quot;, &amp;quot;／&amp;quot; );
 fileName = fileName.replace( &amp;quot;:&amp;quot;, &amp;quot;：&amp;quot; );
 fileName = fileName.replace( &amp;quot;*&amp;quot;, &amp;quot;＊&amp;quot; );
 fileName = fileName.replace( &amp;quot;?&amp;quot;, &amp;quot;？&amp;quot; );
 fileName = fileName.replace( '&amp;quot;', '&amp;#8221;' );
 fileName = fileName.replace( &amp;quot;&amp;lt;&amp;quot;, &amp;quot;＜&amp;quot; );
 fileName = fileName.replace( &amp;quot;&amp;gt;&amp;quot;, &amp;quot;＞&amp;quot; );
 fileName = fileName.replace( &amp;quot;|&amp;quot;, &amp;quot;｜&amp;quot; );
 
 return fileName;
}
function importFeedsInternal( /* XMLDOMNodeList */ outlines, /* FeedFolder */ folder )
{
 for( var i = 0; i &amp;lt; outlines.length; ++i )
 {
  var outline = outlines.item( i );
  
  var type = outline.getAttribute( &amp;quot;type&amp;quot; );
  var text = outline.getAttribute( &amp;quot;text&amp;quot; );
  
  if( text != null )
  {
   text = cleanupFileName( text );
  }
  
  if( type == &amp;quot;rss&amp;quot; )
  {
   var url = outline.getAttribute( &amp;quot;xmlUrl&amp;quot; );
   if( text == null )
   {
    text = getFeedTitle( url );
   }
   
   var feed = null;
   
   if( folder.ExistsFeed( text ) )
   {
    feed = folder.GetFeed( text );
   }
   
   if( feed == null )
   {
    feed = folder.CreateFeed( text, url );
   }
   else if( feed.Url != url )
   {
    feed.Url = url;
   }
  }
  else
  {
   var subfolder = null;
   if( folder.ExistsSubfolder( text ) )
   {
    subfolder = folder.GetSubfolder( text );
   }
   
   if( subfolder == null )
   {
    subfolder = folder.CreateSubfolder( text );
   }
   
   var url = outline.getAttribute( &amp;quot;url&amp;quot; );
   if( type == &amp;quot;include&amp;quot; || ( type == &amp;quot;link&amp;quot; &amp;amp;&amp;amp; url.endsWith( &amp;quot;.opml&amp;quot; ) ) )
   {
    importFeeds( url, subfolder );
   }
   
   importFeedsInternal( outline.selectNodes( &amp;quot;./outline&amp;quot; ), subfolder );
  }
 }
}
function importFeeds( /* string */ opml, /* FeedFolder */ folder )
{
 var xmlDom = WScript.CreateObject( &amp;quot;Microsoft.XMLDOM&amp;quot; );
 xmlDom.async = false;
 xmlDom.load( opml );
 
 var outlines = xmlDom.selectNodes( &amp;quot;/opml/body/outline&amp;quot; );
 importFeedsInternal( outlines, folder );
}
if( WScript.Arguments.Named.Exists( &amp;quot;opml&amp;quot; ) == 0 )
{
 WScript.Arguments.ShowUsage();
 WScript.Quit();
}
var opml = WScript.Arguments.Item( 0 );
if( ! opml.startsWith( &amp;quot;/opml:&amp;quot; ) || opml.length &amp;lt;= &amp;quot;/opml:&amp;quot;.length )
{
 WScript.Arguments.ShowUsage();
 WScript.Quit();
}
opml = opml.substring( &amp;quot;/opml:&amp;quot;.length );
var feedManager = WScript.CreateObject( &amp;quot;Microsoft.FeedsManager&amp;quot; );
importFeeds( opml, feedManager.RootFolder );
]]&amp;gt;
 &amp;lt;/script&amp;gt;
&amp;lt;/job&amp;gt;&lt;/PRE&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/145474.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>OPML 生成 XSLT</title><link>http://blogs.wankuma.com/shannon/archive/2008/06/25/145472.aspx</link><pubDate>Wed, 25 Jun 2008 13:11:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/06/25/145472.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/145472.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/06/25/145472.aspx#Feedback</comments><slash:comments>45</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/145472.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/145472.aspx</trackback:ping><description>&lt;P&gt;RSS の URI から OPML を作る XSLT。&lt;BR&gt;各エントリごとに document 関数でネットの向こうへ RSS を取りに行くので、&amp;lt;?xml-stylesheet?&amp;gt; で使うのは激しく非推奨。&lt;BR&gt;一度 XSLT プロセッサに通して静的な OPML にするが吉。&lt;/P&gt;
&lt;P&gt;生成する OPML は 2.0。&lt;BR&gt;対応フィードは RSS 1.0 と RSS 2.0。Atom には対応してません。&lt;/P&gt;
&lt;pre class="code xml" name="code"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-16&amp;quot; standalone=&amp;quot;yes&amp;quot; ?&amp;gt; 
&amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot;
 xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;
 xmlns:opml=&amp;quot;http://opml.org/spec2&amp;quot;
 xmlns:rdf=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot;
 xmlns:rss=&amp;quot;http://purl.org/rss/1.0/&amp;quot;
 xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot;
 exclude-result-prefixes=&amp;quot;rdf rss dc&amp;quot;&amp;gt;
 
 &amp;lt;xsl:output method=&amp;quot;xml&amp;quot; version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-16&amp;quot;
  omit-xml-declaration=&amp;quot;no&amp;quot; standalone=&amp;quot;yes&amp;quot; indent=&amp;quot;yes&amp;quot; media-type=&amp;quot;application/opml+xml&amp;quot;/&amp;gt;
 
 &amp;lt;xsl:template match=&amp;quot;/opml:opml&amp;quot;&amp;gt;
  &amp;lt;xsl:copy&amp;gt;
   &amp;lt;xsl:attribute name=&amp;quot;version&amp;quot;&amp;gt;2.0&amp;lt;/xsl:attribute&amp;gt;
   &amp;lt;xsl:attribute name=&amp;quot;xml:lang&amp;quot;&amp;gt;ja-JP&amp;lt;/xsl:attribute&amp;gt;
   &amp;lt;xsl:apply-templates/&amp;gt;
  &amp;lt;/xsl:copy&amp;gt;
 &amp;lt;/xsl:template&amp;gt;
 
 &amp;lt;xsl:template match=&amp;quot;//opml:outline[@type='rss']&amp;quot;&amp;gt;
  &amp;lt;xsl:copy&amp;gt;
   &amp;lt;xsl:attribute name=&amp;quot;type&amp;quot;&amp;gt;rss&amp;lt;/xsl:attribute&amp;gt;
   &amp;lt;xsl:attribute name=&amp;quot;xmlUrl&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;@xmlUrl&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;
   &amp;lt;xsl:apply-templates select=&amp;quot;document(@xmlUrl)&amp;quot;/&amp;gt;
  &amp;lt;/xsl:copy&amp;gt;
 &amp;lt;/xsl:template&amp;gt;
 
 &amp;lt;xsl:template match=&amp;quot;/rss[@version='2.0']/channel&amp;quot;&amp;gt;
 
  &amp;lt;xsl:attribute name=&amp;quot;title&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;title&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;
  &amp;lt;xsl:attribute name=&amp;quot;text&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;title&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;
  &amp;lt;xsl:attribute name=&amp;quot;htmlUrl&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;link&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;
  &amp;lt;xsl:attribute name=&amp;quot;description&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;description&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;
  &amp;lt;xsl:attribute name=&amp;quot;version&amp;quot;&amp;gt;RSS&amp;lt;/xsl:attribute&amp;gt;
  &amp;lt;xsl:attribute name=&amp;quot;language&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;language&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;
  
 &amp;lt;/xsl:template&amp;gt;
 
 &amp;lt;xsl:template match=&amp;quot;/rdf:RDF/rss:channel&amp;quot;&amp;gt;
 
  &amp;lt;xsl:attribute name=&amp;quot;title&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;rss:title&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;
  &amp;lt;xsl:attribute name=&amp;quot;text&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;rss:title&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;
  &amp;lt;xsl:attribute name=&amp;quot;htmlUrl&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;rss:link&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;
  &amp;lt;xsl:attribute name=&amp;quot;description&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;rss:description&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;
  &amp;lt;xsl:attribute name=&amp;quot;version&amp;quot;&amp;gt;RSS1&amp;lt;/xsl:attribute&amp;gt;
  &amp;lt;xsl:attribute name=&amp;quot;language&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;dc:language&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;
 
 &amp;lt;/xsl:template&amp;gt;
 
 &amp;lt;xsl:template match=&amp;quot;//opml:*[not (name()='outline' and @type = 'rss' )]&amp;quot;&amp;gt;
  &amp;lt;xsl:copy&amp;gt;
   &amp;lt;xsl:copy-of select=&amp;quot;@*&amp;quot;/&amp;gt;
   &amp;lt;xsl:apply-templates/&amp;gt;
  &amp;lt;/xsl:copy&amp;gt;
 &amp;lt;/xsl:template&amp;gt;
 
 &amp;lt;xsl:template match=&amp;quot;text() | @*&amp;quot;/&amp;gt;
&amp;lt;/xsl:stylesheet&amp;gt;&lt;/pre&gt;
&lt;p&gt;入力ファイルは以下のような感じで。&lt;/p&gt;
&lt;p&gt;type=rss の outline 要素に、xmlUrl から取ってきた情報を補充します。&lt;p&gt;type=rss でない outline 要素はそのまま書き出します。&lt;/p&gt;
&lt;pre class="code xml" name="code"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-16&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;
&amp;lt;opml version=&amp;quot;2.0&amp;quot; xmlns=&amp;quot;http://opml.org/spec2&amp;quot; xml:lang=&amp;quot;ja-JP&amp;quot;&amp;gt;
 &amp;lt;head/&amp;gt;
 &amp;lt;body&amp;gt;
  &amp;lt;outline type=&amp;quot;rss&amp;quot; xmlUrl=&amp;quot;&amp;quot;/&amp;gt;
 &amp;lt;/body&amp;gt;
&amp;lt;/opml&amp;gt;&lt;/pre&gt;
&lt;p&gt;おまけでデバッグ用に作ったのが、type=rss の outline 要素から type と xmlUrl 以外の属性を除去する XSLT。&lt;/p&gt;
&lt;pre class="code xml" name="code"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-16&amp;quot; standalone=&amp;quot;yes&amp;quot; ?&amp;gt;
&amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot;
 xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;
  xmlns:opml=&amp;quot;http://opml.org/spec2&amp;quot;
 xmlns=&amp;quot;http://opml.org/spec2&amp;quot;&amp;gt;
  &amp;lt;xsl:output method=&amp;quot;xml&amp;quot; version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-16&amp;quot;
  omit-xml-declaration=&amp;quot;no&amp;quot; standalone=&amp;quot;yes&amp;quot; indent=&amp;quot;yes&amp;quot; media-type=&amp;quot;application/opml+xml&amp;quot;/&amp;gt;
  &amp;lt;xsl:template match=&amp;quot;//opml:outline[@type='rss']&amp;quot;&amp;gt;
    &amp;lt;xsl:copy&amp;gt;
      &amp;lt;xsl:attribute name=&amp;quot;type&amp;quot;&amp;gt;rss&amp;lt;/xsl:attribute&amp;gt;
      &amp;lt;xsl:attribute name=&amp;quot;xmlUrl&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;@xmlUrl&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;
    &amp;lt;/xsl:copy&amp;gt;
  &amp;lt;/xsl:template&amp;gt;
  &amp;lt;xsl:template match=&amp;quot;//opml:*[not (name()='outline' and @type = 'rss' )]&amp;quot;&amp;gt;
    &amp;lt;xsl:copy&amp;gt;
      &amp;lt;xsl:copy-of select=&amp;quot;@*&amp;quot;/&amp;gt;
      &amp;lt;xsl:apply-templates/&amp;gt;
    &amp;lt;/xsl:copy&amp;gt;
  &amp;lt;/xsl:template&amp;gt;
&amp;lt;/xsl:stylesheet&amp;gt;&lt;/pre&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/145472.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>スクリプトをいくつか上げてみる</title><link>http://blogs.wankuma.com/shannon/archive/2008/06/25/145466.aspx</link><pubDate>Wed, 25 Jun 2008 13:03:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/06/25/145466.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/145466.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/06/25/145466.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/145466.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/145466.aspx</trackback:ping><description>自分用にチョコチョコ作ったものなんかを。&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/145466.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>MSDN サブスクライバ ダウンロードのプロダクト キー用XSLT</title><link>http://blogs.wankuma.com/shannon/archive/2008/06/24/145320.aspx</link><pubDate>Tue, 24 Jun 2008 17:01:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/06/24/145320.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/145320.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/06/24/145320.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/145320.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/145320.aspx</trackback:ping><description>&lt;P&gt;というわけで、&lt;A href="http://blogs.wankuma.com/shannon/archive/2008/06/24/145263.aspx#Feedback"&gt;Streetw☆さん、THREE-ONEさんのご協力&lt;/A&gt;により、なんとか完成しました。ありがとうございます。&lt;/P&gt;
&lt;P&gt;もっとかっこいいコードに改造してくれる方、大募集！&lt;/P&gt;&lt;PRE class="code xml" name="code"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-16&amp;quot; standalone=&amp;quot;yes&amp;quot; ?&amp;gt;
&amp;lt;xsl:stylesheet xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; version=&amp;quot;1.0&amp;quot;&amp;gt;
 &amp;lt;xsl:output
  method=&amp;quot;xml&amp;quot; version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-16&amp;quot; standalone=&amp;quot;no&amp;quot; indent=&amp;quot;yes&amp;quot; media-type=&amp;quot;application/xhtml+xml&amp;quot;
  doctype-public=&amp;quot;-//W3C//DTD XHTML 1.1//EN&amp;quot; doctype-system=&amp;quot;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&amp;quot;/&amp;gt;
 
 &amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;
  &amp;lt;html&amp;gt;
   &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;プロダクトキー一覧&amp;lt;/title&amp;gt;
    &amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;
    &amp;lt;![CDATA[
     table
     {
      border-collapse: collapse;
     }
     
     th, td
     {
      border: thin solid black;
      padding: 0.5em;
     }
    ]]&amp;gt;
    &amp;lt;/style&amp;gt;
   &amp;lt;/head&amp;gt;
   &amp;lt;body&amp;gt;
    &amp;lt;xsl:apply-templates select=&amp;quot;YourKey&amp;quot;/&amp;gt;
   &amp;lt;/body&amp;gt;
  &amp;lt;/html&amp;gt;
 &amp;lt;/xsl:template&amp;gt;
 
 &amp;lt;xsl:template match=&amp;quot;YourKey&amp;quot;&amp;gt;
  &amp;lt;table summary=&amp;quot;一覧&amp;quot;&amp;gt;
   &amp;lt;thead&amp;gt;
    &amp;lt;tr&amp;gt;
     &amp;lt;th scope=&amp;quot;col&amp;quot;&amp;gt;Product&amp;lt;/th&amp;gt;
     &amp;lt;th scope=&amp;quot;col&amp;quot;&amp;gt;Key&amp;lt;/th&amp;gt;
     &amp;lt;th scope=&amp;quot;col&amp;quot;&amp;gt;Type&amp;lt;/th&amp;gt;
    &amp;lt;/tr&amp;gt;
   &amp;lt;/thead&amp;gt;
   &amp;lt;tbody&amp;gt;
    &amp;lt;xsl:apply-templates select=&amp;quot;Product_Key&amp;quot;&amp;gt;
     &amp;lt;xsl:sort select=&amp;quot;@Name&amp;quot;/&amp;gt;
    &amp;lt;/xsl:apply-templates&amp;gt;
   &amp;lt;/tbody&amp;gt;
  &amp;lt;/table&amp;gt;
 &amp;lt;/xsl:template&amp;gt;
 
 &amp;lt;xsl:template match=&amp;quot;Product_Key&amp;quot;&amp;gt;
  
  &amp;lt;xsl:variable name=&amp;quot;thisName&amp;quot; select=&amp;quot;@Name&amp;quot;/&amp;gt;
  &amp;lt;xsl:variable name=&amp;quot;thisKey&amp;quot; select=&amp;quot;Key/text()&amp;quot;/&amp;gt;
  
  &amp;lt;xsl:variable name=&amp;quot;sameNamesBefore&amp;quot; select=&amp;quot;count(preceding-sibling::Product_Key[ @Name = $thisName ])&amp;quot;/&amp;gt;
  &amp;lt;xsl:variable name=&amp;quot;sameNamesAfter&amp;quot; select=&amp;quot;count(following-sibling::Product_Key[ @Name = $thisName ])&amp;quot;/&amp;gt;
  
  &amp;lt;xsl:variable name=&amp;quot;sameNameAndKeysBefore&amp;quot; select=&amp;quot;count(preceding-sibling::Product_Key[ Key/text() = $thisKey and @Name = $thisName ])&amp;quot;/&amp;gt;
  &amp;lt;xsl:variable name=&amp;quot;sameNameAndKeysAfter&amp;quot; select=&amp;quot;count(following-sibling::Product_Key[ Key/text() = $thisKey and @Name = $thisName ])&amp;quot;/&amp;gt;
  
  &amp;lt;xsl:if test=&amp;quot;$sameNameAndKeysBefore = 0&amp;quot;&amp;gt;
   &amp;lt;tr&amp;gt;
    &amp;lt;xsl:if test=&amp;quot;$sameNamesBefore = 0&amp;quot;&amp;gt;
     &amp;lt;td&amp;gt;
      &amp;lt;xsl:if test=&amp;quot;( $sameNamesAfter - $sameNameAndKeysAfter ) != 0&amp;quot;&amp;gt;
       &amp;lt;xsl:attribute name=&amp;quot;rowspan&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;$sameNamesAfter - $sameNameAndKeysAfter + 1&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;
      &amp;lt;/xsl:if&amp;gt;
      &amp;lt;xsl:value-of select=&amp;quot;@Name&amp;quot;/&amp;gt;
     &amp;lt;/td&amp;gt;
    &amp;lt;/xsl:if&amp;gt;
    &amp;lt;td&amp;gt;
     &amp;lt;xsl:value-of select=&amp;quot;Key&amp;quot; disable-output-escaping=&amp;quot;yes&amp;quot;/&amp;gt;
    &amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;
     &amp;lt;xsl:value-of select=&amp;quot;Key/@Type&amp;quot;/&amp;gt;
    &amp;lt;/td&amp;gt;
   &amp;lt;/tr&amp;gt;
  &amp;lt;/xsl:if&amp;gt;
 &amp;lt;/xsl:template&amp;gt;
 
&amp;lt;/xsl:stylesheet&amp;gt;
&lt;/PRE&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/145320.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>