簡體   English   中英

XSLT-1.0:將逗號分隔的值轉換為元素值

[英]XSLT-1.0: Convert comma-separated values to element values

我正在嘗試獲取XML文件並將其與XSLT轉換。
我嘗試轉換的XML如下所示:

<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轉換為所需結果有任何建議嗎?
請並感謝您的幫助。

使用此XSLT。
它是XSLT版本1.0,並通過名為<xsl:template>稱為field遞歸來分隔逗號分隔的值,並將每個值封裝在<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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM