请问下面是否可行?鉴于我们有低于丑陋(但有效)的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>
答案 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>