2016-09-24 11 views
-1

Я пытался сравнить два файла XML, которые имеют одинаковый контент, но по разным строкам. Чтобы преодолеть это, я пытался сортировать XML-файлы на одном из дочерних узлов (который обычно отличается положением в обоих файлах).Сортировка XML-файла на основе значения узла

Вот мой пример 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> 

Я пытаюсь разобраться на основе <membId> узла для <RC> родительского узла. Какой бы метод я ни пытался, мой документ не сортируется. Я пробовал использовать XSLT, но сортировка не работает. Я даже пытался написать скрипт python, но он не сортировался.

Вот мой питон скрипт -

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 test.py 2.xml membId запустить скрипт (обратите внимание, что 2.xml этого имя файла для ввода XML и membId является тегом я искал).

Я по-настоящему признателен за любую помощь в том, где я ошибаюсь. Я только начинаю с Python, поэтому я мог бы сделать довольно очевидную ошибку. Для меня будет работать скрипт python или XSLT (или).

+2

** 1 ** «* Я попытался с помощью XSLT, но сортировка не делает. работа. * «Пожалуйста, разместите свою попытку, чтобы мы могли ее исправить, вместо того, чтобы писать код для вас с нуля. - ** 2. ** Пока вы на нем, отправляйте также ожидаемый результат, так как «* sort на основе узла для родительского узла » - довольно загадочное требование. - ** 3. ** Почему ваш вопрос помечен 'XSLT 2.0'? Фактически вы используете процессор, поддерживающий XSLT 2.0? –

+1

LXML Python поддерживает только XSLT 1.0, используя процессор libxslt. – Parfait

+0

@ michael.hor257k Я отправлю еще один вопрос, просто с XSLT, который ищет помощь в этой части. И да, я использовал XSLT2.0, и именно поэтому я пометил его так. – Incognito

ответ

2

Рассмотрите следующий скрипт XSLT с интеграцией Python lxml. Кроме того, вы пытаетесь запустить процесс динамической командной строки. К сожалению, 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

Смежные вопросы