2016-06-10 1 views
0

Просто хотелось узнать, удалось ли преобразовать XML из одного стандарта в другой с помощью файла преобразования XSLT. Я пытаюсь преобразовать метаданные FGDC в ISO 19139. У меня есть XSLT, который должен иметь возможность его преобразовать.Преобразование XML FGDC в XML с использованием XSLT

Если возможно, есть что-то, что мне не хватает в следующем коде?

from lxml import etree 


f_xml = 'U:\\PROJECTS\\FGDC2ISO\\A08727.mxd.xml' 
f_xsl = 'U:\\PROJECTS\\FGDC2ISO\\ISO2.xslt' 
f_out = 'U:\\PROJECTS\\FGDC2ISO\\A08727_ISO.mxd.xml' 

transform = etree.XSLT(etree.parse(f_xsl)) 
result = transform(etree.parse(f_xml)) 
result.write(f_out) 

Вот ссылка на XSLT EDIT ссылку в настоящее время хорошо:

http://service.ncddc.noaa.gov/rdn/www/metadata-standards/metadata-xml/documents/csdgm2iso19115-2.xslt

Пример XSML файла:

<?xml version="1.0" encoding="utf-8" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gmi="http://www.isotc211.org/2005/gmi" xmlns:gmx="http://www.isotc211.org/2005/gmx" xmlns:gsr="http://www.isotc211.org/2005/gsr" xmlns:gss="http://www.isotc211.org/2005/gss" xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vmf="http://www.altova.com/MapForce/UDF/vmf" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:grp="http://www.altova.com/Mapforce/grouping" xmlns="http://www.isotc211.org/2005/gmi" version="2.0" exclude-result-prefixes="fn grp vmf xs xsi xsl"> 
    <xsl:template name="vmf:vmf1_inputtoresult"> 
     <xsl:param name="input" select="()"/> 
     <xsl:choose> 
      <xsl:when test="$input='POINT'"> 
       <xsl:value-of select="'point'"/> 
      </xsl:when> 
      <xsl:when test="$input='PIXEL'"> 
       <xsl:value-of select="'point'"/> 
      </xsl:when> 
      <xsl:when test="$input='GRID CELL'"> 
       <xsl:value-of select="'area'"/> 
      </xsl:when> 
      <xsl:when test="$input='VOXEL'"> 
       <xsl:value-of select="'area'"/> 
+0

Ссылка на таблицу стилей не работает. – mzjn

+0

Извините, я отредактировал эту ссылку. Должен работать сейчас. Я столкнулся с ошибкой lxml.etree.XSLTParseError: Недопустимое выражение – MapZombie

ответ

0

результатом преобразования XSLT является объект дерева, а не строка. Следовательно, вам нужно преобразовать в строку перед выходом в файл. Вы даже можете распечатать вывод даже указать кодировку с помощью tostring():

transform = etree.XSLT(etree.parse(f_xsl)) 
result = transform(etree.parse(f_xml)) 
xmlstr = etree.tostring(result, encoding="iso-8859-1", pretty_print=True) 

with open('Output.xml','wb') as f: 
    f.write(xmlstr) 
+0

Спасибо Parfait, я получаю ошибку ниже при запуске этого скрипта. >>> Traceback (самый последний вызов последнего): Файл "", строка 254, в run_nodebug Файл "", строка 19, в Файл "SRC/LXML/xslt.pxi", линия 409, в lxml.etree.XSLT .__ init__ (ЦСИ \ LXML \ lxml.etree.c: 173339) lxml.etree.XSLTParseError: Недопустимое выражение >>> – MapZombie

+0

lxml.etree.XSLTParseError: Недопустимое выражение – MapZombie

+0

Там будет вопрос с скриптом XSLT. Отправьте фрагмент. В качестве напоминания, Lxml Python может запускать только скрипты XSLT 1.0. – Parfait