将xml转换为合适的文本
我有一个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> 提前感谢。您需要的是一个
<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('
',$pcurrentIndents, '{')"/>
<xsl:apply-templates>
<xsl:with-param name="pcurrentIndents" select=
"concat($pcurrentIndents, $pIndents)"/>
</xsl:apply-templates>
<xsl:value-of select="concat('
',$pcurrentIndents, '}')"/>
</xsl:template>
<xsl:template match="*[not(*)]">
<xsl:param name="pcurrentIndents" select="''"/>
<xsl:text>
</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('
',$pcurrentIndents, '{')"/>
<xsl:apply-templates>
<xsl:with-param name="pcurrentIndents" select=
"concat($pcurrentIndents, $pIndents)"/>
</xsl:apply-templates>
<xsl:value-of select="concat('
',$pcurrentIndents, '}')"/>
</xsl:template>
<xsl:template match="*[not(*)]">
<xsl:param name="pcurrentIndents" select="''"/>
<xsl:text>
</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应该仍然不做任何修改就给出输出。无论如何,感谢您的回复。感谢您如此精彩的回复。您的代码运行得非常好,但我仍然需要一些修改,比如在行的末尾添加逗号“,”。如果您能分享/解释我这段代码是如何工作的,这将是一个很好的学习/理解谢谢你的解释,我将尝试修改它以满足我的需求。