創造

2011-01-31 9 views
-1

の創造の最もエレガントな方法は何ですか:創造

  1. は内の値に基づいて、要素名のソースサンプルXML
  2. 動的な作成からフラットな構造ソースノード

サンプルXML:

<block4> 
<tag> 
    <name>16R</name> 
    <value>GENL</value> 
</tag> 
<tag> 
    <name>23G</name> 
    <value>REPL</value> 
</tag> 
<tag> 
    <name>16S</name> 
    <value>GENL</value> 
</tag> 
<tag> 
    <name>16R</name> 
    <value>USECU</value> 
</tag> 
<tag> 
    <name>16R</name> 
    <value>FIA</value> 
</tag> 
<tag> 
    <name>94B</name> 
    <value>:PLIS//EXCH/XTSE</value> 
</tag> 
<tag> 
    <name>16S</name> 
    <value>FIA</value> 
</tag> 
<tag> 
    <name>16S</name> 
    <value>USECU</value> 
</tag> 
<tag> 
    <name>16R</name> 
    <value>CADETL</value> 
</tag> 
<tag> 
    <name>98A</name> 
    <value>:XDTE//20110128</value> 
</tag> 
<tag> 
    <name>16S</name> 
    <value>CADETL</value> 
</tag> 
</block4> 

マイ所望の出力です。

<block4> 
<GENL> 
    <tag> 
     <name>23G</name> 
     <value>REPL</value> 
    </tag> 
</GENL> 
<USECU> 
    <FIA> 
     <tag> 
      <name>94B</name> 
      <value>:PLIS//EXCH/XTSE</value> 
     </tag> 
    </FIA> 
</USECU> 
<CADETL> 
    <tag> 
     <name>98A</name> 
     <value>:XDTE//20110128</value> 
    </tag> 
</CADETL> 
</block4> 
+0

グルーピングロジックがまったく明確ではありません。 CADETL /タグが必要ですが、USECU/FIAが必要です。どのようにして決定されるのか、どのように知るべきですか?そして各グループに含まれる値はかなりランダムであるようです。 REPLがGENL要素にあるのはなぜですか? – Flack

+0

@Flackこれは本当の力強さですが、いくつかの深い考えの後で、あなたは恐ろしい真実を発見します。内容は構造を反駁します。 'REPL'を含むフラグメントの前に' GENL'を含むフラグメントが続いていますが、値自体を囲む 'FIA'は' USECU'の間に囲まれています。 – Filburt

答えて

1

このスタイルシート:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()[1]|@*"/> 
     </xsl:copy> 
     <xsl:apply-templates select="following-sibling::node()[1]"/> 
    </xsl:template> 
    <xsl:template match="tag[name='16R']"> 
     <xsl:element name="{value}"> 
      <xsl:apply-templates select="following-sibling::node()[1]"/> 
     </xsl:element> 
     <xsl:apply-templates select="following-sibling::tag 
             [name='16S'] 
             [value=current()/value] 
             [1]/following-sibling::node()[1]"/> 
    </xsl:template> 
    <xsl:template match="tag[name='16S']"/> 
</xsl:stylesheet> 

出力:

<block4> 
    <GENL> 
     <tag> 
      <name>23G</name> 
      <value>REPL</value> 
     </tag> 
    </GENL> 
    <USECU> 
     <FIA> 
      <tag> 
       <name>94B</name> 
       <value>:PLIS//EXCH/XTSE</value> 
      </tag> 
     </FIA> 
    </USECU> 
    <CADETL> 
     <tag> 
      <name>98A</name> 
      <value>:XDTE//20110128</value> 
     </tag> 
    </CADETL> 
</block4> 

:ファイングレイントラバーサル。

+0

+1。私はあなたがどのように要件を理解したか分かりません。 – Flack

+0

@Flack:ありがとう。グループ化の質問の後、これが最もよく聞かれるタイプの質問です。 –

+0

どうかありがとうございます。あなたのコメント/回答が私のメールアカウントに送られなかったのです。非常にエレガントなソリューション。 – Andy

関連する問題