我正在应用XPath 2.0的concat函数来连接两个xml元素。它连接它们但以文本形式给出输出。我正在使用XSLT进行此转换。
注意:我在互联网上研究过它,concat函数默认将数据转换为文本格式,有没有办法绕过它,以便在连接后数据仍然可以是XML格式。
输入XML:
<?xml version="1.0"?><?xml-stylesheet type="text/xsl"?>
<jsonObject>
<alarm>
<groups>1</groups>
<typeKey>FIRE</typeKey>
<longitude>65656</longitude>
<victim>2</victim>
<letitude>6566</letitude>
</alarm>
<alarm2>
<data>Stewart</data>
<data1>John</data1>
</alarm2>
</jsonObject>
输入XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:template match="//jsonObject/alarm">
<Latitude><xsl:value-of select="letitude"/></Latitude>
<Combine><xsl:value-of select="concat(//alarm,//alarm2) "/></Combine>
</xsl:template>
</xsl:stylesheet>
当前结果:
<?xml version="1.0" encoding="UTF-8"?>
<Latitude>6566</Latitude>
<Combine>
1
FIRE
65656
2
6566
Stewart
John
</Combine>
预期结果:
<?xml version="1.0" encoding="UTF-8"?>
<Latitude>6566</Latitude>
<Combine>
<groups>1</groups>
<typeKey>FIRE</typeKey>
<longitude>65656</longitude>
<victim>2</victim>
<letitude>6566</letitude>
<data>Stewart</data>
<data1>John</data1>
</Combine>
答案 0 :(得分:1)
concat()仅对文本进行操作。因此,它获取每个的文本值,然后将它们连接在一起。您不连接节点,而是需要复制每个节点:
<Combine><xsl:copy-of select="//alarm/*"/><xsl:copy-of select="//alarm2/*"/></Combine>
答案 1 :(得分:1)
如另一个答案所述,您应该在这里使用xsl:copy-of
。
但是,另一种方法是使用基于模板的解决方案,构建在XSLT identity template之上。
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="alarm">
<Latitude><xsl:value-of select="letitude"/></Latitude>
<Combine>
<xsl:apply-templates />
<xsl:apply-templates select="../alarm2/*" />
</Combine>
</xsl:template>
<xsl:template match="alarm2" />
</xsl:stylesheet>
因此,您可以通过将alarm
元素转换为Combine
元素并添加alarm2
的子元素来对其进行转换。第二个模板匹配alarm2
本身以阻止它输出两次。然后使用标识模板复制XML中的所有其他节点。