2011-01-31 121 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。我們應該如何知道它是如何確定的?包括在每個組中的值似乎是非常隨機的。爲什麼我們在GENL元素中有REPL? – Flack 2011-01-31 12:57:26

+0

@Flack這是一個真正的謎題,但經過深思熟慮之後,你會發現可怕的真相:內容重構了一個結構。包含「REPL」的片段在前後,後面跟着包含「GENL」的片段,而圍繞某個值的「FIA」本身被包含在「USECU」之間。 – Filburt 2011-01-31 15:15:04

回答

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> 

注意:細粒度遍歷。