2013-06-03 129 views
0

我有这种格式的样本XML:XSL转换分裂逗号分隔值

<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> 

我想从标识标签提取逗号分隔值,这样我可以清楚地设置他们在我的输出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> 

我怎么可以拆分值,以产生这种输出的?

回答

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> 
+0

非常感谢你,帮我拆的值。现在如何更改XML中存在的标签的名称? 说,我想包含'',但是以''的名义,我该怎么做?例如, '' – Rg90

+0

将' \t \t \t \t \t的 \t \t \t' –

+0

是的,这会给我测试-1。我怎样才能把这个特定的值放入一个值属性中? '' – Rg90