我有这种格式的示例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>
如何拆分值以生成此类输出?
答案 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>