XSL转换以拆分逗号分隔值

时间:2013-06-03 10:43:04

标签: xml xslt csv tags

我有这种格式的示例XML:

<Records>
 <Record>
  <Name>Test</Name>
  <IDS>Test-1, Test-2, Test-3</IDS>
  <Type>Type1</Type>
 </Record>
 <Record>
  <Name>XML</Name>
  <IDS>Test-4, Test-5</IDS>
  <Type>XMLType</Type>
 </Record>
</Records>

我想从IDs标记中提取逗号分隔值,这样我就可以在输出XML中清楚地设置它们。所以在这种情况下,由于总共有5个ID,我将有5个记录,其中3个在一个组中,2个在另一个组中。

基本上,我的输出应该是这样的:

<Records>
 <Record>
  <Name>Test</Name>
  <ID>Test-1</ID>
 <Record>
 <Record>
  <Name>Test</Name>
  <ID>Test-2</ID>
 </Record>
 ..
 ..
 <Record>
  <Name>XML</Name>
  <ID>Test-5</ID>
 </Record>
</Records>

如何拆分值以生成此类输出?

1 个答案:

答案 0 :(得分:2)

这里是基于xslt-1.0解决方案的“身份转换” IDS的内容通过对splitIDS的递归调用进行吐出。 记录/类型将被忽略,因为它们不在您的输出示例中 尝试这样的事情:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <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>

    <!-- ignore IDS in Record -->
    <xsl:template match="Record/IDS" />

    <!-- ignore Type in Record -->
    <xsl:template match="Record/Type" />


    <xsl:template match="Record">
        <xsl:call-template name="splitIDS">
            <xsl:with-param name="ids" select="IDS" />
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="splitIDS">
        <xsl:param name="ids"/>
        <xsl:choose>
            <xsl:when test="contains($ids,',')">
                <xsl:call-template name="splitIDS">
                    <xsl:with-param name="ids" select="substring-before($ids,',')"/>
                </xsl:call-template>
                <xsl:call-template name="splitIDS">
                    <xsl:with-param name="ids" select="substring-after($ids,' ')"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy>
                    <xsl:apply-templates />
                    <ID>
                        <xsl:value-of select="$ids"/>
                    </ID>
                </xsl:copy>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="Records">
        <xsl:copy>
            <xsl:apply-templates select="Record" />
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

将生成以下输出:

<?xml version="1.0"?>
<Records>
  <Record>
    <Name>Test</Name>
    <ID>Test-1</ID>
  </Record>
  <Record>
    <Name>Test</Name>
    <ID>Test-2</ID>
  </Record>
  <Record>
    <Name>Test</Name>
    <ID>Test-3</ID>
  </Record>
  <Record>
    <Name>XML</Name>
    <ID>Test-4</ID>
  </Record>
  <Record>
    <Name>XML</Name>
    <ID>Test-5</ID>
  </Record>
</Records>