« MSDNサブスクライバーダウンロードとかのプロダクトキー一覧をXMLでエクスポートしたはいいけど、XMLのままだとちょっと見難いので、XSLT埋め込みテクノロジを流用してみた | トップページ | 脆弱性とは何か »

重複を削ればもっとわかりやすい

昨日のXSLTではとりあえず表示できればいいと思っていたんだけど、ソートしてみるといくつかの重複に気づく。
そして、重複データを気にしだすと夜も眠れない。

重複データを削除するには、DBだったらdistinctとかするんだろうけど・・・

なにやら、distinct-valueとかいう関数がある、と思ったら、XQuery用のやつで、それも新機能だったり。
新機能Onlyでは、何かと不便。

ローテクで考えると、前方なり後方なりに同じ値がないことを確認できればよいということに気づく。
それならなんとかなるか、とやってみた。
とりあえず、製品名だけでやってみたけど、これがすっきり表示されてなかなか良い。
#@Nameだけじゃなく、Keyも併せるとさらに良いかも知れないが・・・

以下に改良したものを載せておく。

<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="#"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>
  <xsl:variable name="keys">keys.xml</xsl:variable>
  <xsl:template match="Product_Key">
    <xsl:if test="not(Key/@Type='CUS')">
      <tr>
        <td><xsl:value-of select="@Name"/></td>
        <td><xsl:apply-templates select="Key"/></td>
      </tr>
    </xsl:if>
  </xsl:template>
  <xsl:template match="Key">
    <xsl:if test="not(position()=1)"><br/></xsl:if>
    [<xsl:value-of select="@Type"/>]:<xsl:value-of select="."/>
  </xsl:template>
  <xsl:template match="/">
    <html>
      <head>
        <title>Product Keys</title>
      </head>
      <body>
        <table border="1">
          <tr><th>Product Name</th><th>Key</th></tr>
          <xsl:for-each select="document($keys)//Product_Key">
            <xsl:sort select="@Name"/>
            <xsl:if test="not(@Name=preceding-sibling::Product_Key/@Name)">
              <xsl:apply-templates select="."/>
            </xsl:if>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

あとはCUS形式の中身を抽出できたらと思う・・・けど、そこまでする必要は今のところない。

|

« MSDNサブスクライバーダウンロードとかのプロダクトキー一覧をXMLでエクスポートしたはいいけど、XMLのままだとちょっと見難いので、XSLT埋め込みテクノロジを流用してみた | トップページ | 脆弱性とは何か »

趣味」カテゴリの記事

コメント

この記事へのコメントは終了しました。