xpath concat函数将XML数据转换为文本

时间:2014-12-10 08:27:36

标签: xml xslt xpath xslt-2.0

我正在应用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>

2 个答案:

答案 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中的所有其他节点。