Java - 从另一个XML + XSD生成XML

Ale*_*lex 3 xml xslt xsd

我有一个从另一个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>
    
    Run Code Online (Sandbox Code Playgroud)

是的,我知道它很乱,但这就是我得到它的方式.

  1. 我还有一个XSD架构,我用它来使用JAXB生成相应的Java类(这可以正常工作).

我现在需要的是一种从原始XML文件创建另一个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>
Run Code Online (Sandbox Code Playgroud)

如果没有自己的解析/创建机制,您对我应该使用哪些框架/库有任何建议吗?

我在考虑使用XSLT,但我没有任何经验...

谢谢!

Dim*_*hev 5

这种转变:

<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>
Run Code Online (Sandbox Code Playgroud)

当应用于提供的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>
Run Code Online (Sandbox Code Playgroud)

产生想要的,正确的结果:

<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>
Run Code Online (Sandbox Code Playgroud)