ValueList中的动态XML元素名称

时间:2016-02-16 20:10:20

标签: xml xslt xml-parsing xslt-1.0 xslt-2.0

请问下面是否可行?鉴于我们有低于丑陋(但有效)的XML,其元素中包含valueList:

<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>

我在此示例中所做的工作如下......但是无法将Column元素的值列表作为值的动态元素。

<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 个答案:

答案 0 :(得分: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>

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