如何按参数行对XML进行分组

时间:2014-05-28 19:47:12

标签: xml xslt

如何转换xml:

<tags>

  <f28>
    <ROW f1='f28 row1 f1' f2='f28 row1 f2'/>
    <ROW f1='f28 row2 f1' f2='f28 row2 f2'/>
  </f28>

  <f16>
    <ROW f1='f16 row1 f1' f2='f16 row1 f2'/>
    <ROW f1='f16 row2 f1' f2='f16 row2 f2'/>
  </f16>

</tags>

在:

<doc name="number_id1">
 <parameter1>f28 row1 f1</parameter1>
 <parameter2>f28 row1 f2</parameter2>
 <parameter3>f16 row1 f1</parameter3>
 <parameter4>f16 row1 f2</parameter4>
</doc>

<doc name="number_id2">
 <parameter1>f28 row2 f1</parameter1>
 <parameter2>f28 row2 f2</parameter2>
 <parameter3>f16 row2 f1</parameter3>
 <parameter4>f16 row2 f2</parameter4>
</doc>

我需要使用xslt在上面指定的另一个xml中转换XML。


编辑:

以下有真实数据的示例。我的xml:

<tags>
  <f28>
      <ROW f1='FULL' f5='no mutation' f6='p53'/>
      <ROW f1='STG' f5='certain' f6='BRCA1'/>
  </f28>
  <f16>
      <ROW f1='MAMA' f2='44' f3='Carcinoma'/>
      <ROW f1='Ovario' f2='46'f3='in situ'/>
  </f16>
</tags>

我想要以下结果:

<doc_name="number_id1">
 <parameter1>FULL</parameter1>
 <parameter2>no mutation</parameter2>
 <parameter3>p53</parameter3>
 <parameter4>MAMA</parameter4>
 <parameter5>44</parameter5>
 <parameter6>Carcinoma</parameter6>

</doc>

<doc_name="number_id2">
 <parameter1>STG</parameter1>
 <parameter2>certain</parameter2>
 <parameter3>BRCA1</parameter3>
 <parameter4>Ovario</parameter4>
 <parameter5>46</parameter5>
 <parameter6>in situ</parameter6>
</doc>

我正在使用xsl 1.0而我无法解决此问题。


编辑:

正确的结果是:

<doc doc_name="number_id1">
 <parameter1>FULL</parameter1>
 <parameter2>no mutation</parameter2>
 <parameter3>p53</parameter3>
 <parameter4>MAMA</parameter4>
 <parameter5>44</parameter5>
 <parameter6>Carcinoma</parameter6>

</doc>

<doc doc_name="number_id2">
 <parameter1>STG</parameter1>
 <parameter2>certain</parameter2>
 <parameter3>BRCA1</parameter3>
 <parameter4>Ovario</parameter4>
 <parameter5>46</parameter5>
 <parameter6>in situ</parameter6>
</doc>

1 个答案:

答案 0 :(得分:2)

如果您真的正在进行策略,请尝试以下样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:strip-space elements="*"/>

    <xsl:output indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="/">
        <xsl:for-each select="tags/*">
            <doc name="number_id{count(preceding-sibling::*) + 1}">
                <xsl:for-each select="*/@*">
                    <xsl:element name="parameter{position()}">
                        <xsl:value-of select="."/>
                    </xsl:element>
                </xsl:for-each>
            </doc>
        </xsl:for-each>

    </xsl:template>

</xsl:stylesheet>

修改

要按ROW分组,请尝试以下样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:strip-space elements="*"/>

    <xsl:output indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="ROW">
        <xsl:variable name="pos" select="position()"/>
        <xsl:element name="doc">
            <xsl:attribute name="doc_name">number_id<xsl:number/></xsl:attribute>
        <xsl:for-each select="@*">
            <xsl:element name="parameter{position()}">
                <xsl:value-of select="."/>
            </xsl:element>
        </xsl:for-each>
        <xsl:apply-templates select="../following-sibling::*/ROW[position()=$pos]" mode="transfer"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="tags/*[position() &gt; 1]/ROW"/>

    <xsl:template match="tags/*[position() &gt; 1]/ROW" mode="transfer">
        <xsl:variable name="pos" select="position()"/>
        <xsl:for-each select="@*">
            <xsl:element name="parameter{position() + count(../../preceding-sibling::*/ROW[position()=$pos]/@*)}">
                <xsl:value-of select="."/>
            </xsl:element>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

它会产生您想要的输出

<doc doc_name="number_id1">
    <parameter1>FULL</parameter1>
    <parameter2>no mutation</parameter2>
    <parameter3>p53</parameter3>
    <parameter4>MAMA</parameter4>
    <parameter5>44</parameter5>
    <parameter6>Carcinoma</parameter6>
</doc>
<doc doc_name="number_id2">
    <parameter1>STG</parameter1>
    <parameter2>certain</parameter2>
    <parameter3>BRCA1</parameter3>
    <parameter4>Ovario</parameter4>
    <parameter5>46</parameter5>
    <parameter6>in situ</parameter6>
</doc>