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

时间:2012-02-08 15:15:13

标签: 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>
    
  2. 是的,我知道这很乱,但这就是我得到它的方式。

    1. 我还有一个XSD架构,我用它来使用JAXB生成相应的Java类(这可以正常工作)。
    2. 我现在需要的是一种从原始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>
      

      对于我应该使用哪些框架/库而不进行自己的解析/创建机制,您有什么建议吗?

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

      谢谢!

1 个答案:

答案 0 :(得分: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>

应用于提供的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>