2016-02-16 58 views
0

请问下面是否可行?鉴于我们下面丑(但有效)的XML包含值列表中的所有元素:ValueList中的动态XML元素名称

<LIST> 
    <COLUMN> COL1 COL2 COL3 COLn </COLUMN> 
    <VALUE>  val1 val2 val3 valn </VALUE> 
    <VALUE>  val4 val5 val6 valn2 </VALUE> 
</LIST> 

是否有可能使用XSLT把它改造成这种格式?

<LIST> 
    <VALUE> 
     <COL1>val1</COL1> 
     <COL2>val2</COL2> 
     <COL3>val3</COL3> 
     <COLn>valn</COLn> 
    </VALUE> 
    <VALUE> 
     <COL1>val4</COL1> 
     <COL2>val5</COL2> 
     <COL3>val6</COL3> 
     <COLn>valn2</COLn> 
    </VALUE> 
</LIST> 

我在此示例中所做的是以下..但无法获得列元素的值列表是对值的动态元素..

<xsl:template name="Sample"> 
    <LIST> 
    <xsl:for-each select="$srcDelete/LIST/VALUE"> 
     <VALUE>   
      <xsl:for-each select="tokenize(normalize-space(.),' ')"> 
       <item><xsl:value-of select="."/></item> 
      </xsl:for-each>    
     </VALUE> 
    </xsl:for-each> 
    </LIST> 
</xsl:template> 

<xsl:template match="/"> 
     <xsl:call-template name="Sample"/> 
</xsl:template> 

...它的输出:

<?xml version="1.0" encoding="UTF-8"?> 
<LIST> 
    <VALUE> 
     <item>val1</item> 
     <item>val2</item> 
     <item>val3</item> 
     <item>valn</item> 
    </VALUE> 
    <VALUE> 
     <item>val4</item> 
     <item>val5</item> 
     <item>val6</item> 
     <item>valn2</item> 
    </VALUE> 
</LIST> 

回答

1

可以令牌化的列名,以及然后用它们:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

<xsl:output indent="yes"/> 

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

<xsl:template match="LIST"> 
    <LIST> 
    <xsl:variable name="col-names" select="for $name in tokenize(COLUMN, '\s+')[normalize-space()] return normalize-space($name)"/> 
    <xsl:for-each select="VALUE"> 
     <VALUE>   
      <xsl:for-each select="tokenize(normalize-space(.),' ')"> 
       <xsl:variable name="pos" select="position()"/> 
       <xsl:element name="{$col-names[$pos]}"> 
        <xsl:value-of select="."/> 
       </xsl:element> 
      </xsl:for-each>    
     </VALUE> 
    </xsl:for-each> 
    </LIST> 
</xsl:template> 
</xsl:transform> 

在线at http://xsltransform.net/94rmq6N

+0

非常感谢马丁,这完美的作品! –