2016-09-24 27 views
-1

同じ内容であるが異なる行にある2つのXMLファイルを比較しようとしました。これを克服するために、私は子ノードのいずれか(通常は両方のファイルの位置が異なる)でXMLをソートしようとしていました。ノード値に基づくXMLファイルのソート

は、ここで私は<RC>親ノードの<membId>ノードに基づいて並べ替えしようとしています私のサンプルXMLファイル

<Report> 
<rptName>Sample</rptName> 
<reportNameGrp> 
<grpName>AggrDataSet</grpName> 
<RC> 
<rptSubHdr> 
<membLglNam>Registered Customer 103</membLglNam> 
<membId>RC103</membId> 
<relCM>CM022</relCM> 
</rptSubHdr> 
</RC> 
<RC> 
<rptSubHdr> 
<membLglNam>Registered Customer 055</membLglNam> 
<membId>RC055</membId> 
<relCM>CM022</relCM> 
</rptSubHdr> 
</RC> 
<RC> 
<rptSubHdr> 
<membLglNam>Registered Customer 047</membLglNam> 
<membId>RC047</membId> 
<relCM>CM022</relCM> 
</rptSubHdr> 
</RC> 
<RC> 
<rptSubHdr> 
<membLglNam>Registered Customer 015</membLglNam> 
<membId>RC015</membId> 
<relCM>CM022</relCM> 
</rptSubHdr> 
</RC> 
<RC> 
<rptSubHdr> 
<membLglNam>Registered Customer 024</membLglNam> 
<membId>RC024</membId> 
<relCM>CM022</relCM> 
</rptSubHdr> 
</RC> 
</reportNameGrp> 
</Report> 

です。どのような方法で試しても、私のドキュメントはソートできません。私はXSLTを使ってみましたが、並べ替えは機能しません。私もpythonスクリプトを書こうとしましたが、それは並べ替えに失敗します。私は(2.xmlは、入力XMLのファイル名であるとmembIdは私が探していたタグであることに注意してください)スクリプトを実行するpython test.py 2.xml membIdを実行

import sys 
from lxml import etree 

filename, tag = sys.argv[1:] 

doc = etree.parse(filename, etree.XMLParser(remove_blank_text=True)) 
root = doc.getroot() 
root[:] = sorted(root, key=lambda el: el.findtext(tag)) 
print etree.tostring(doc, pretty_print=True) 

- ここ

は私のPythonスクリプトです。

私が間違っているところで本当に助けてもらえますか?私はちょうどPythonから始めているので、かなり明白な間違いをしているかもしれません。 PythonスクリプトまたはXSLTソリューション(いずれか)が私のために機能します!

+2

** 1 **「*私は、XSLTを使用してみましたが、ソートはしていません。 *あなたのコードを最初から書くのではなく、修正できるように、あなたの試みを投稿してください。 - ** 2。**あなたがそれをしている間に、 "ノードに基づくソート​​親ノードのノード*"は予想外の出力です。 - ** 3。**あなたの質問に「XSLT 2.0」というタグが付いているのはなぜですか?実際にXSLT 2.0をサポートするプロセッサを使用していますか? –

+1

Pythonのlxmlは、libxsltプロセッサを使用するXSLT 1.0のみをサポートしています。 – Parfait

+0

@ michael.hor257k XSLTを使用して、その部分のヘルプを求める別の質問を投稿します。そして、はい、私はXSLT2.0を使用していたので、それがタグ付けされています。 – Incognito

答えて

2

Pythonのlxml統合で次のXSLTスクリプトを検討してください。また、動的コマンドラインプロセスを実行しようとします。残念ながら、XSLTはソートするノードの種類によって構造が変わります。以下は意志特にソート<membId>昇順で:

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" /> 
<xsl:strip-space elements="*"/> 

    <!-- Identity Transform --> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- Sort MembId under RC/rptSubHdr --> 
    <xsl:template match="reportNameGrp"> 
    <xsl:copy>  
     <xsl:copy-of select="grpName"/> 
     <xsl:apply-templates select="RC">   
      <xsl:sort select="rptSubHdr/membId" order="ascending"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

</xsl:transform> 

Pythonの

import lxml.etree as et 

// LOAD XML AND XSL SOURCES 
dom = et.parse('Input.xml') 
xslt = et.parse('XSLTScript.xsl') 

// TRANSFORM 
transform = et.XSLT(xslt) 
newdom = transform(dom) 

// SAVE TO FILE 
with open('Output.xml', 'wb') as f: 
    f.write(newdom) 
+0

これは 'grpName'要素を破棄します。 –

+0

ありがとう!それは私が指示を与えるのに役立ちますが、実際に問題を解決するものではありません。私はXSLTだけで別の質問を投稿するつもりだと私は問題を抱えているので、私はそれを助けることができる。 – Incognito

+0

問題点は何ですか?あなたの質問タイトルとテキストには、この回答が行うノードごとにXML値をソートすることが記載されています。希望する出力を詳細に記述してください。また、XSLT 1.0は[document()](http://www.w3schools.com/xsl/func_document.asp)を使用して他のファイルから解析することもできます。 – Parfait

関連する問題