【问题标题】:XSL Transform to split comma separated valuesXSL 转换以拆分逗号分隔值
【发布时间】:2013-06-03 10:43:04
【问题描述】:

我有一个这种格式的示例 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>

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

【问题讨论】:

    标签: xml xslt csv tags


    【解决方案1】:

    这里是基于“身份转换”的 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>
    

    【讨论】:

    • 非常感谢,这帮助我拆分了值。现在如何更改 XML 中存在的标签的名称?说,我想包含&lt;Type&gt;,但以&lt;RecordType&gt; 的名义,我该怎么做?例如,&lt;RecordType value="Test-1"&gt;
    • &lt;xsl:template match="Record/Type"/&gt;更改为:&lt;xsl:template match="Record/Type" &gt; &lt;RecordType&gt; &lt;xsl:apply-templates /&gt; &lt;/RecordType&gt; &lt;/xsl:template&gt;
    • 是的,这会给我Test-1。如何将该特定值放入 value 属性中? &lt;RecordType value="Test-1"/&gt;
    • 使用xsl:attribute或更短的&lt;RecordType value="{.}" /&gt;
    • 它实际上将整个 IDS 归还给我。 value="Test-1, Test-2, Test-3"。输出也只有 3 &lt;Record&gt;
    猜你喜欢
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    相关资源
    最近更新 更多