2015-02-13 3 views
0

Я хочу преобразовать XML-документ с определенной схемой в другой XML-документ, придав ему определенную другую схему.Преобразование XML-документа в другую схему XML

В качестве примера, вход может быть следующим:

<?xml version="1.0" encoding="UTF-8"?> 
<Abcd field1="0" field2="3" field3="1" field4="_sometext" field5="text" field6="Helloworld" /> 
<Efgh _id="2790" size="2"> 
    <i>2771</i> 
    <i>2781</i> 
</Efgh> 

Соответствующий выход для этого примера:

<?xml version="1.0" encoding="UTF-8"?> 
<field name="Abcd"> field1="0" field2="3" field3="1" field4="_sometext" field5="text" field6="Helloworld" </field> 
<field name="Efgh"> _id="2790" size="2" 
    <i>2771</i> 
    <i>2781</i> 
</field> 

Есть только два типа тегов:

  1. такие, как Abcd, с переменным числом полей (поле1 в поле N)
  2. такие, как Efgh, которые также всегда имеют некоторое количество субтиттов < i> someText </i>. (Символ «i» всегда используется там).

Я не уверен, как это сделать (Regex? XSLT?).

Если бы были только теги формы 1 (например, Abcd), использование sed в bash могло бы сделать работу, я думаю, но с тегами формы 2, я не знаю, как действовать дальше.

Edit: Я написал небольшой трубопровод с использованием SED, которая преобразует строку формы 1 в правильный аналог, это работает следующим образом:

cat input1.xml | sed "s/ * /\"> /" | sed "s/</<field name=\"/" | sed "s,/>,</field>," 

Но как продолжить?

+0

Это может быть сделано одним из многих способов, но Regex, похоже, не является правильным инструментом. XSLT или язык сценариев (bash, vb script и т. Д.) Кажутся лучшим выбором. – user2366842

+0

"* Есть только два типа тегов *« Ну, не совсем: '' тоже тег. Однако реальной проблемой с вашим примером является отсутствующий корневой элемент на входе и выходе. - Также: вы уверены, что хотите переместить атрибуты из тега и сделать их бессмысленной строкой ?! –

+0

Я просто попытался сделать фрагменты, содержащие только соответствующую информацию, которую нужно преобразовать, это вход и выход, поскольку он должен быть изменен, извините за путаницу. – tkja

ответ

0

Я собираюсь угадать здесь; приведены в следующем примере ввода:

XML-

<root> 
    <Abcd field1="0" field2="3" field3="1" field4="_sometext" field5="text" field6="Helloworld" /> 
    <Efgh _id="2790" size="2"> 
     <i>2771</i> 
     <i>2781</i> 
    </Efgh> 
</root> 

следующая таблица стилей:

XSLT-1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" 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> 

<xsl:template match="root/*"> 
    <field name="{local-name()}"> 
     <xsl:apply-templates select="@*|node()"/> 
    </field> 
</xsl:template> 

</xsl:stylesheet> 

приведет к:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <field name="Abcd" field1="0" field2="3" field3="1" field4="_sometext" field5="text" field6="Helloworld"/> 
    <field name="Efgh" _id="2790" size="2"> 
     <i>2771</i> 
     <i>2781</i> 
    </field> 
</root> 

, который для меня кажется скорее более вероятным, чем требуемый выход.

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