2010-12-01 12 views
1

世界各地の国を国別コードでリストした登録フォームにドロップダウンリストを追加したいクライアントがあります。その目的のために、彼は私にthis fileを与えた。残念ながら、データの構造は私が必要とするものに対しては機能しません。以下は私が望む構造です。 XSLTなどを使用してデータを自動的に再構成する方法はありますか?ありがとう!XMLファイルの再構成

<countries> 
    <country code="US"> 
    <region>Alaska</region> 
    <region>California</region> 
    </country> 
</countries> 

答えて

1

これは簡単に変換するXSLTのアイデンティティに単一のテンプレートを追加することによって達成される:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="node() | @*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node() | @*" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="countries/*"> 
     <country code="{name()}"> 
      <xsl:apply-templates select="region"/> 
     </country> 
    </xsl:template> 

</xsl:stylesheet> 
+0

私はそれがもっと簡潔にできることを知っていました( - : – Murph

+0

MurphとRobertに感謝します。 –

0

私はそのファイルを変換する必要があった場合、私はちょうどそのちょうどループを実行し、にデータをドロップし、現在の形式に対応したオブジェクトに現在のファイルをデシリアライズ、迅速なヘルパーコンソールアプリケーションを記述します。上記の新しい形式に対応する新しいオブジェクトの階層構造を作成し、それをXMLにシリアル化し直します。

このようにして、同じファイルを再度インポートする必要があった場合は、変換アプリケーションを再実行することができます。

0

あなたは、ファイルを変換するためにあなたの好きな正規表現のツールを使用することができます。たとえば、.NETでは次のように使用できます。

string result = Regex.Replace(Regex.Replace(input, "<(..)>", "<country code=\"$1\">"), "</..>", "</country>"); 

$ 1は、最初の一致するグループ "(..)"に一致する文字列を参照します。ここで

あなたconverted file

は、より多くの情報のためのウェブサイトを参照してくださいregular-expressions.infoています。

0

私のXSLT-fuはそれだけではありませんが、XSLTを使用することができます。

あなたは実際に賢明なことをしようとしています。それは、国コードタグをタグに変換することです。

特定のノードの子のリストを繰り返し処理することは簡単です。現在のノードのタグ名を取得することができます。必要なものを多かれ少なかれ出力することができます。私が今までにしていたことは何でも)は、ノード名を摘発するための正確な呪文です。

編集:答えの手放すには余りにも良い質問(学習機会)

に欠落ビットがstackoverflow

に、当然のことながら、あるので、それは私が知っている内容に基づいて(あなたにこれを提供します。 ..私は地域のコピーを簡素化することができると確信しているが、私は方法がわからない):!歓迎の改善のための

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="countries" /> 

     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="countries"> 
     <countries> 
      <xsl:for-each select="child::*"> 
       <country code="{local-name()}"> 
        <xsl:apply-templates select="region" /> 
       </country> 
      </xsl:for-each> 
     </countries> 
    </xsl:template> 

    <xsl:template match="region"> 
     <region> 
      <xsl:value-of select="."/> 
     </region> 
    </xsl:template> 

</xsl:stylesheet> 

提案 - などの適切な修正されます!

0

私は(電子メール通知を受信しませんでした)最初の答えをここでチェックしている必要がありますが、私が管理これを行うための小さなASP/VBプログラムを書いてください。あなたの答えのためにみんなありがとう!私がここで最初にチェックしたのであれば、時間を節約することができました。少なくとも私は今再利用できるプログラムを持っています。

関連する問題