将xml转换为合适的文本

将xml转换为合适的文本,xml,xslt,transform,Xml,Xslt,Transform,我有一个xml,看起来像这样 <person> <name> <name-first>foo</name-first> <name-last>bar</name-last> </name> <age>20</age> <city>nowhere</city> </person> 提前感谢。您需要的是一个

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

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

提前感谢。

您需要的是一个XML到JSON的转换器


试试这个:

下面是一个示例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>

人:
{
姓名:{
名字第一:,
姓氏:
}, 
年龄:,
城市:
}

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

例如:

我通过
xml2json.xslt
运行XML,并生成以下JSON输出:

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

首先,这里有一个简单的转换:

<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>
<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
}
说明

<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>
<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
}
  • 有两个匹配元素的模板

  • 匹配
    *[*]
    的模板匹配将元素作为子元素的元素。它使用
    name()
    函数生成当前匹配元素的名称,然后是
    字符,然后是NL字符、当前缩进(空格数),最后是
    {
    字符。然后模板应用于当前匹配元素的子节点,该子节点具有
    $pcurrentIndents
    参数,该参数通过当前缩进,并随空格字符的预先定义增量而增加(如全局参数
    $pIndents
    中所指定的,最后,在新行上使用当前缩进,放置闭合大括号

  • *[非(*)]
    匹配的模板(没有任何元素作为子元素的元素)类似,但更简单。它在当前缩进处输出匹配元素的名称和
    字符。在此处应用模板将调用非元素节点的XSLT内置模板——在本例中,选择与文本节点匹配的内置模板,并将文本节点复制到输出


  • 许多编程语言都有一个XML库,因此您可以轻松地创建一个快速的程序来执行此操作。如果您喜欢的语言没有XML库,您也可以通过字符串操作来执行此操作。@ingo vals-感谢您的响应,@oded-我尝试了以下{:},但我没有得到我想要的。请帮助。好问题,+1。请参阅我的答案,以获得一个完整、简短和简单的XSLT解决方案。这正是我想要的。谢谢。是的,这是真的。但是,我想要一种更通用的方法,而不需要显式指定节点名称。我的意思是,如果我在XML中再添加几个节点,XSL应该仍然不做任何修改就给出输出。无论如何,感谢您的回复。感谢您如此精彩的回复。您的代码运行得非常好,但我仍然需要一些修改,比如在行的末尾添加逗号“,”。如果您能分享/解释我这段代码是如何工作的,这将是一个很好的学习/理解谢谢你的解释,我将尝试修改它以满足我的需求。