2017-03-21 19 views
0

私は以下のXMLファイルをRを使用して解析します.XMLは深い構造を持ち、サブノードの数もさまざまです。深いXML構造体を抽出します

----------------------------------------------------------- 
Id | id | ReferenceGroup | FirstName | MiddleName | Surname 
----------------------------------------------------------- 
100 | Name1 | ABC, DEF | Carl Bangouvounda | NA | Toziz 
----------------------------------------------------------- 
100 | Name2 | ABC, GHI, JKL, MNO, DEF | Tozize | NA | Bangouvonda 
----------------------------------------------------------- 
100 | Name3 | MNO | Carol | NA | Tozize 
----------------------------------------------------------- 
100 | Name4 | PQR, MNO | Carol | Bangouvonda | Tozize 
----------------------------------------------------------- 
100 | Name5 | GHI, JKL, DEF | Carl Bangouvonda | NA | Toziz 
----------------------------------------------------------- 

Idは要素の人の属性からで、他のすべてがPersonNameDetailsから、次のとおりです。

<?xml version="1.0" encoding="UTF-8"?> 

<Alert date="20161223_2" type="full"> 
<Records> 
<Person Id="100"> 
    <PersonNameDetails> 
    <PersonNames id="Name1"> 
     <ReferenceGroup ReferenceGroupCode="ABC"/> 
     <ReferenceGroup ReferenceGroupCode="DEF"/> 
     <PersonNameValue> 
     <FirstName>Carl Bangouvounda</FirstName> 
     <Surname>Toziz</Surname> 
     </PersonNameValue> 
    </PersonNames> 
    <PersonNames id="Name2"> 
     <ReferenceGroup ReferenceGroupCode="ABC"/> 
     <ReferenceGroup ReferenceGroupCode="GHI" ReferenceGroupLanguageCode="en"/> 
     <ReferenceGroup ReferenceGroupCode="JKL"/> 
     <ReferenceGroup ReferenceGroupCode="MNO"/> 
     <ReferenceGroup ReferenceGroupCode="DEF"/> 
     <PersonNameValue> 
     <FirstName>Tozize</FirstName> 
     <Surname>Bangouvonda</Surname> 
     </PersonNameValue> 
    </PersonNames> 
    <PersonNames id="Name3"> 
     <ReferenceGroup ReferenceGroupCode="MNO"/> 
     <PersonNameValue> 
     <FirstName>Carol</FirstName> 
     <Surname>Tozize</Surname> 
     </PersonNameValue> 
    </PersonNames> 
    <PersonNames id="Name4"> 
     <ReferenceGroup ReferenceGroupCode="PQR"/> 
     <ReferenceGroup ReferenceGroupCode="MNO"/> 
     <PersonNameValue> 
     <FirstName>Carol</FirstName> 
     <MiddleName>Bangouvonda</MiddleName> 
     <Surname>Tozize</Surname> 
     </PersonNameValue> 
    </PersonNames> 
    <PersonNames id="Name5"> 
     <ReferenceGroup ReferenceGroupCode="GHI" ReferenceGroupLanguageCode="en"/> 
     <ReferenceGroup ReferenceGroupCode="JKL"/> 
     <ReferenceGroup ReferenceGroupCode="DEF"/> 
     <PersonNameValue> 
     <FirstName>Carl Bangouvonda</FirstName> 
     <Surname>Toziz</Surname> 
     </PersonNameValue> 
    </PersonNames> 
    </PersonNameDetails> 
</Person> 
</Records> 
</Alert> 

予想される出力は以下の通りです。また、ReferenceGroupCodeを同じPersonnames要素内の1つの文字列に連結したいと思います。

私は次のコードでXSLTに変換するにはアドバイスに従っ:ReferenceGroup出力が

<ReferenceGroupCode>ABC,DEF</ReferenceGroupCode> 

すべてのヘルプは高く評価されるだろうように、XSLTコードを変更する方法

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output version="1.0" encoding="UTF-8" indent="yes" method="xml"/> 
<xsl:strip-space elements="*"/> 

    <xsl:template match="/Alert "> 
    <xsl:copy> 
     <xsl:apply-templates select="Records"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Records">  
    <xsl:apply-templates select="Person"/>  
    </xsl:template> 

    <xsl:template match="Person">  
    <xsl:apply-templates select="PersonNameDetails"/>  
    </xsl:template> 

    <xsl:template match="PersonNameDetails">  
    <xsl:apply-templates select="PersonNames"/>  
    </xsl:template> 

    <xsl:template match="PersonNames">  
    <xsl:apply-templates select="PersonNameValue"/>  
    </xsl:template> 

    <xsl:template match="PersonNameValue"> 
    <PersonNameValue> 
     <Id><xsl:value-of select="ancestor::Person/@Id"/></Id> 
     <id><xsl:value-of select="ancestor::PersonNames/@id"/></id> 
     <xsl:copy-of select="FirstName"/> 
     <MiddleName><xsl:value-of select="MiddleName"/></MiddleName> 
     <Surname><xsl:value-of select="Surname"/></Surname> 
     <ReferenceGroupCode><xsl:value-of select="ancestor::PersonNames/ReferenceGroup/@ReferenceGroupCode"/></ReferenceGroupCode> 
    </PersonNameValue> 
    </xsl:template> 

</xsl:transform> 

+0

私はXMLをXSLTに変換しないことをお勧めします。このXMl解析問題を解決するために必要な情報の種類を教えていただけますか? –

答えて

0

XSLTについてはわかりませんが、PersonNamesノードでxpathを使用して、欠落値または複数の値を処理する関数を記述することができます。

doc <- xmlParse("<your XML file>") 
x <- getNodeSet(doc, "//PersonNames") 
xpath2 <-function(x, ...){ 
    y <- xpathSApply(x, ...) 
    ifelse(length(y) == 0, NA, paste(y, collapse=", ")) 
} 
y <- data.frame(
    id =   sapply(x, xpath2, ".", xmlGetAttr, "id"), 
    ReferenceGroup= sapply(x, xpath2, ".//ReferenceGroup", xmlGetAttr, "ReferenceGroupCode"), 
    FirstName =  sapply(x, xpath2, ".//FirstName", xmlValue), 
    MiddleName = sapply(x, xpath2, ".//MiddleName", xmlValue), 
    Surname =  sapply(x, xpath2, ".//Surname", xmlValue) 
) 
    id   ReferenceGroup   FirstName MiddleName  Surname 
1 Name1    ABC, DEF Carl Bangouvounda  <NA>  Toziz 
2 Name2 ABC, GHI, JKL, MNO, DEF   Tozize  <NA> Bangouvonda 
3 Name3      MNO    Carol  <NA>  Tozize 
4 Name4    PQR, MNO    Carol Bangouvonda  Tozize 
5 Name5   GHI, JKL, DEF Carl Bangouvonda  <NA>  Toziz 

多分、PersonNameノードの数を数えてPerson IDを追加しますか?

n <- xpathSApply(doc, "//Person/PersonNameDetails", xmlSize) 
y$ID <- rep(xpathSApply(doc, "//Person", xmlGetAttr, "Id"), n) 
関連する問題