2017-02-27 113 views
0

我正在嘗試獲取XML文件並使用XSLT進行轉換。
的XML我想轉換看起來像這樣:XSLT-1.0:將逗號分隔的值轉換爲元素值

<root> 
    <TAG>10, 1, 3, 123, 4001, 34, 200, 105, 54, 0, 0, 0</TAG> 
</root> 

當我運行轉換,我想結果顯示如下:

<Field1>10</Field1> 
<Field2>1</Field2> 
... 
<Field12>0</Field12> 

然而,我的XSLT文件不是像設計一樣工作。
每當我運行轉換器,我回來把它作爲響應:

<Field_1> 
    <TAG>10, 1, 3, 123, 4001, 34, 200, 105, 54, 0, 0, 0</TAG> 
</Field_1> 

這裏是我的XSLT文件:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:kml="http://www.opengis.net/kml/2.2" version="1.0"> 
<xsl:strip-space elements = "*"/> 
<xsl:output method = "xml" indent = "yes"/> 

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

<xsl:template match="root"> 
    <xsl:call-template name="listItem"> 
     <xsl:with-param name="tag" select="TAG"/> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="listItem"> 
    <xsl:param name="features"/> 
    <xsl:choose> 
     <xsl:when test="contains($features, ',')"> 
      <xsl:element name="Field_{position()}"> 
       <xsl:apply-templates select="@*|node()"/> 
       <xsl:value-of select="normalize-space(substring-before($features, ','))"/> 
       <xsl:variable name="nextValue" select="substring-after($features, ',')"/> 
      </xsl:element> 
      <xsl:if test="normalize-space($nextValue)"> 
       <xsl:call-template name="listItem"> 
        <xsl:with-param name="features" select="$nextValue"/> 
       </xsl:call-template> 
      </xsl:if> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:element name="Field_{position()}"> 
       <xsl:apply-templates select="@*|node()"/> 
       <xsl:value-of select="$features"/> 
      </xsl:element> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
</xsl:stylesheet> 

是否有人在如何讓我的XSLT文件轉換任何建議我的XML到期望的結果?
請謝謝你的幫助。

回答

0

使用此XSLT。
它是XSLT版本1.0,並使用名爲field的名爲<xsl:template>的遞歸來劃分逗號分隔值並封裝<Field>元素中的每個值。該元素的名稱由靜態字符串Field加上遞歸傳遞的名爲cnt的變量生成。

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" /> 

    <xsl:template match="/root"> 
    <root> 
     <xsl:call-template name="field"> 
     <xsl:with-param name="cnt" select="1" /> 
     <xsl:with-param name="txt" select="concat(TAG/text(),',')" /> 
     </xsl:call-template> 
    </root> 
</xsl:template> 

    <xsl:template name="field"> 
    <xsl:param name="cnt" /> 
    <xsl:param name="txt" /> 
    <xsl:element name="{concat('Field',$cnt)}"> 
     <xsl:value-of select="normalize-space(substring-before($txt,','))"/> 
    </xsl:element> 
    <xsl:if test="normalize-space(substring-after($txt,',')) != ''"> 
     <xsl:call-template name="field"> 
     <xsl:with-param name="cnt" select="$cnt + 1" /> 
     <xsl:with-param name="txt" select="substring-after($txt,',')" /> 
     </xsl:call-template> 
    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

結果 - 根據需要 - 是:

<?xml version="1.0"?> 
<root> 
    <Field1>10</Field1> 
    <Field2>1</Field2> 
    <Field3>3</Field3> 
    <Field4>123</Field4> 
    <Field5>4001</Field5> 
    <Field6>34</Field6> 
    <Field7>200</Field7> 
    <Field8>105</Field8> 
    <Field9>54</Field9> 
    <Field10>0</Field10> 
    <Field11>0</Field11> 
    <Field12>0</Field12> 
</root> 
+0

謝謝!完美工作。 –