将xml转换为合适的文本

时间:2011-05-23 10:45:20

标签: xml xslt transform

我有一个xml,看起来像这样

<person>
   <name>
      <name-first>foo</name-first>
      <name-last>bar</name-last>
   </name>
   <age>20</age>
   <city>nowhere</city>
 </person>

我想将其转换为

person:
   {
     name: {
             name-first:'foo', 
             name-last:'bar'  
           }, 
    age:'20',
    city:'nowhere' 
  }

提前致谢。

4 个答案:

答案 0 :(得分:3)

您想要的是XML到JSON转换器。

试试这个:http://www.thomasfrank.se/xml_to_json.html

答案 1 :(得分:1)

这是一个示例xsl模板,它可以让您了解如何将xml转换为所需的输出:

<xsl:template match="person">
person:
   {
     name: {
             name-first:<xsl:value-of select="name/name-first"/>, 
             name-last:<xsl:value-of select="name/name-last"/>  
           }, 
    age:<xsl:value-of select="age"/>,
    city:<xsl:value-of select="city"/> 
  }
</xsl:template>

答案 2 :(得分:1)

有许多通用的XSLT解决方案可用于将XML转换为JSON输出。

例如:

我通过 xml2json-xslt's xml2json.xslt运行了您的XML并生成了以下JSON输出:

{
  "person":
     {
       "name":
         {
           "name-first":"foo",
           "name-last":"bar"
         },
         "age":20,
         "city":"nowhere"
      }
 }

答案 3 :(得分:1)

这是一个简单的转换 - 开始

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pIndents" select="'  '"/>

 <xsl:template match="*[*]">
   <xsl:param name="pcurrentIndents" select="''"/>
     <xsl:value-of select="concat($pcurrentIndents, name(), ':')"/>
     <xsl:value-of select="concat('&#xA;',$pcurrentIndents, '{')"/>
      <xsl:apply-templates>
        <xsl:with-param name="pcurrentIndents" select=
         "concat($pcurrentIndents, $pIndents)"/>
      </xsl:apply-templates>
     <xsl:value-of select="concat('&#xA;',$pcurrentIndents,  '}')"/>
 </xsl:template>

 <xsl:template match="*[not(*)]">
  <xsl:param name="pcurrentIndents" select="''"/>
  <xsl:text>&#xA;</xsl:text>
  <xsl:value-of select="concat($pcurrentIndents, name(), ':')"/>
  <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档

<person>
    <name>
        <name-first>foo</name-first>
        <name-last>bar</name-last>
    </name>
    <age>20</age>
    <city>nowhere</city>
</person>

产生了想要的正确结果

person:
{  name:
  {
    name-first:foo
    name-last:bar
  }
  age:20
  city:nowhere
}

<强>解释

  1. 有两个匹配元素的模板。

  2. 匹配*[*]的模板匹配具有子元素的元素。它使用name()函数生成当前匹配元素的名称,然后是:字符,然后是NL字符,当前缩进(空格数),最后是{字符。然后将模板应用于当前匹配元素的子节点,并使用$pcurrentIndents参数传递当前缩进,并使用预定义的空格字符增量(在全局参数$pIndents中指定)最后,在新行和使用当前缩进,结束大括号是putput。

  3. 匹配*[not(*)]的模板(没有任何元素作为子元素的元素)类似,但更简单。它输出当前缩进处的匹配元素的名称和:字符。这里应用模板为非元素节点调用XSLT内置模板 - 在这种情况下,选择与文本节点匹配的内置模板,它只是将文本节点复制到输出。