这里是基于“身份转换”的 xslt-1.0 解决方案。
IDS 的内容由对 splitIDS 的递归调用吐出。Record/Type 将被忽略,因为它们不在您的输出示例中。
尝试这样的事情:
<?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>