Python 使用xslt将重复的子节点合并到csv/tsv的一行中

Python 使用xslt将重复的子节点合并到csv/tsv的一行中,python,xml,xslt,Python,Xml,Xslt,如果我有以下xml文件 <AnnotationSet Name="Bio"> <Annotation Id="6164" Type="Health_Care_Related_Organization" StartNode="0" EndNode="6"> <Feature> <Name className="java.lang.String">VOCABS</Name> <Value className="java.lan

如果我有以下xml文件

<AnnotationSet Name="Bio">
<Annotation Id="6164" Type="Health_Care_Related_Organization" StartNode="0" EndNode="6">
<Feature>
  <Name className="java.lang.String">VOCABS</Name>
  <Value className="java.lang.String">NCI</Value>
</Feature>
<Feature>
  <Name className="java.lang.String">Negation</Name>
  <Value className="java.lang.String">Affirmed</Value>
</Feature>
<Feature>
  <Name className="java.lang.String">inst_full</Name>
  <Value className="java.lang.String">http://linkedlifedata.com/resource/umls/id/C0002424</Value>
</Feature>
<Feature>
  <Name className="java.lang.String">Experiencer</Name>
  <Value className="java.lang.String">Patient</Value>
</Feature>
<Feature>
  <Name className="java.lang.String">PREF</Name>
  <Value className="java.lang.String">Clinic</Value>
</Feature>
<Feature>
  <Name className="java.lang.String">inst</Name>
  <Value className="java.lang.String">C0002424</Value>
</Feature>
<Feature>
  <Name className="java.lang.String">STY</Name>
  <Value className="java.lang.String">Health Care Related Organization</Value>
</Feature>
<Feature>
  <Name className="java.lang.String">TUI</Name>
  <Value className="java.lang.String">T093</Value>
</Feature>
<Feature>
  <Name className="java.lang.String">language</Name>
  <Value className="java.lang.String"></Value>
</Feature>
<Feature>
  <Name className="java.lang.String">Temporality</Name>
  <Value className="java.lang.String">Recent</Value>
</Feature>
<Feature>
  <Name className="java.lang.String">tui_full</Name>
  <Value className="java.lang.String">http://linkedlifedata.com/resource/semanticnetwork/id/T093</Value>
</Feature>
</Annotation>
</AnnotationSet>
我只熟悉编写XSLT,其中每个节点(即,包含每行的每一列)。在这里,每一行都包含在其中,我很难拿出我需要的东西

我尝试编写以下xslt:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text" encoding="utf-8"/>

<xsl:template match="/">
    <xsl:text>Name, Value &#10;</xsl:text>
    <xsl:for-each select="AnnotationSet/Annotation/Feature">
        <xsl:value-of select="concat(Name,',',Value)"/>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

您试图连接名称和值是没有意义的,因为您需要一个接一个地连接它们,而不是一个接一个地连接它们。更不用说,您只需要在最上面一行中使用每个名称一次

试着这样做:

XSLT1.0


显示您当前使用的XSLT抱歉,我以为我已经输入了XSLT,但我会忘记代码标记。很抱歉您正试图以命令式的方式使用XSLT,而实际上XSLT并不是命令式语言。阅读应用模板和XSLT的编写风格。学习按预期的方式使用XSLT。@brucezepplin在输入中总是只有一个注释元素,因此在输出中只有一个数据行吗?
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text" encoding="utf-8"/>

<xsl:template match="/">
    <xsl:text>Name, Value &#10;</xsl:text>
    <xsl:for-each select="AnnotationSet/Annotation/Feature">
        <xsl:value-of select="concat(Name,',',Value)"/>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>
#!/usr/bin/env python

import lxml.etree as ET
import sys
import os

dom = ET.parse('gatetest.xml')
xslt = ET.parse('gate.xsl')
transform = ET.XSLT(xslt)
newdom = transform(dom)
print(ET.tostring(newdom, pretty_print=True))
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/AnnotationSet">
    <xsl:text>StartNode&#9;EndNode</xsl:text>
    <xsl:for-each select="Annotation[1]/Feature">
        <xsl:text>&#9;</xsl:text>
        <xsl:value-of select="Name"/>
    </xsl:for-each>
    <xsl:for-each select="Annotation">
        <xsl:text>&#10;</xsl:text>
        <xsl:value-of select="@StartNode" />
        <xsl:text>&#9;</xsl:text>
        <xsl:value-of select="@EndNode" />
        <xsl:for-each select="Feature">
            <xsl:text>&#9;</xsl:text>
            <xsl:value-of select="Value"/>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>
StartNode   EndNode VOCABS  Negation    inst_full   Experiencer PREF    inst    STY TUI language    Temporality tui_full
0   6   NCI Affirmed    http://linkedlifedata.com/resource/umls/id/C0002424 Patient Clinic  C0002424    Health Care Related Organization    T093        Recent  http://linkedlifedata.com/resource/semanticnetwork/id/T093