Java - генерировать XML из другого XML + XSD - PullRequest
3 голосов
/ 08 февраля 2012

У меня проблема с генерацией XML-файла из другого XML-файла. Мой вариант использования такой:

  1. У меня есть XML-файл в следующем формате:

    <tag1>
        <tag2>value2</tag2>
        <tag3>value3_1, value3_2, value3_3</tag3>
        <tag4>
           <tag4_1>value4_1</tag4_1>
           <tag4_2>value4_2</tag4_2>
        </tag4>
    </tag1>
    

Да, я знаю, что это довольно грязно, но так я и получил.

  1. У меня также есть схема XSD, которую я использую для генерации соответствующих классов Java с использованием JAXB (это работает нормально).

Теперь мне нужен способ создать еще один XML-файл из исходного файла следующего формата:

<element name="tag1.tag2">
     <value>value2</value>
</element>
<element name="tag1.tag3">
     <value>value3_1, value3_2, value3_3</value>
</element>
<element name="tag1.tag4.tag4_1"> 
     <value>value4_1</value>
</element>
<element name="tag1.tag4.tag4_2"> 
     <value>value4_2</value>
</element>

Есть ли у вас какие-либо предложения относительно того, какую инфраструктуру / библиотеки мне следует использовать для достижения этой цели без использования моего собственного механизма синтаксического анализа / создания?

Я думал об использовании XSLT, но у меня нет никакого опыта с ним ...

Спасибо!

1 Ответ

5 голосов
/ 08 февраля 2012

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="*[not(*)]">
  <xsl:variable name="vName">
   <xsl:for-each select="ancestor-or-self::*">
    <xsl:if test="not(position() = 1)">.</xsl:if>
    <xsl:value-of select="name()"/>
   </xsl:for-each>
  </xsl:variable>

  <element name="{$vName}">
   <value><xsl:value-of select="."/></value>
  </element>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<tag1>
    <tag2>value2</tag2>
    <tag3>value3_1, value3_2, value3_3</tag3>
    <tag4>
        <tag4_1>value4_1</tag4_1>
        <tag4_2>value4_2</tag4_2>
    </tag4>
</tag1>

дает желаемый, правильный результат :

<element name="tag1.tag2">
   <value>value2</value>
</element>
<element name="tag1.tag3">
   <value>value3_1, value3_2, value3_3</value>
</element>
<element name="tag1.tag4.tag4_1">
   <value>value4_1</value>
</element>
<element name="tag1.tag4.tag4_2">
   <value>value4_2</value>
</element>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...