如何转换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>
答案 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() > 1]/ROW"/>
<xsl:template match="tags/*[position() > 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>