首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于拆分逗号分隔值的XSL转换

用于拆分逗号分隔值的XSL转换
EN

Stack Overflow用户
提问于 2013-06-03 18:43:04
回答 1查看 5.3K关注 0票数 0

我有一个示例XML,格式如下:

代码语言:javascript
运行
复制
<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个in,因此我将有5个记录,其中3个在一个组中,2个在另一个组中。

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

代码语言:javascript
运行
复制
<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>

如何拆分这些值以生成这种输出?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-03 19:18:01

这里是一个基于“标识转换”的xslt-1.0解决方案。

IDS的内容是通过对splitIDS的递归调用生成的。记录/类型将被忽略,因为它们不在您的输出示例中。

尝试如下所示:

代码语言:javascript
运行
复制
<?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>

这将生成以下输出:

代码语言:javascript
运行
复制
<?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>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16894908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档