Чтобы помочь в обратном проектировании файлов XML, я использую обработчик Python SAX, как показано ниже.
Может ли кто-нибудь предоставить эквивалентный XSLT для выполнения той же работы?
Это пример входного файла:
<beatles>
<beatle>
<name>
<first>John</first>
<last>Lennon</last>
</name>
</beatle>
<beatle>
<name>
<first>Paul</first>
<last>McCartney</last>
</name>
</beatle>
<beatle>
<name>
<first>George</first>
<last>Harrison</last>
</name>
</beatle>
<beatle>
<name>
<first>Ringo</first>
<last>Starr</last>
</name>
</beatle>
</beatles>
Таким образом, идея состоит в том, чтобы получить список всех уникальных путей (игнорируя атрибуты), чтобы получить базовую отправную точку для написания шаблонов и т. Д.
from xml.sax.handler import ContentHandler
from xml.sax import make_parser
from xml.sax import SAXParseException
class ShowPaths(ContentHandler):
def startDocument(self):
self.unique_paths=[]
self.current_path=[]
def startElement(self,name,attrs):
self.current_path.append(name)
path="/".join(self.current_path)
if path not in self.unique_paths:
self.unique_paths.append(path)
def endElement(self,name):
self.current_path.pop();
def endDocument(self):
for path in self.unique_paths:
print path
if __name__=='__main__':
handler = ShowPaths()
saxparser = make_parser()
saxparser.setContentHandler(handler)
in_f=open("d:\\beatles.xml","r")
saxparser.parse(in_f)
in_f.close()
И результат запуска программы на примере:
beatles
beatles/beatle
beatles/beatle/name
beatles/beatle/name/first
beatles/beatle/name/last