XML将子元素提取为元素

时间:2016-03-15 21:21:20

标签: xml xslt

我在Rest API调用中有以下XML:

<opens type="array">
 <open>
  <account-id>123</account-id>
  <campaign-id type="integer">10000</campaign-id>
  <contact-id type="integer">302315</contact-id>
  <browser>Other</browser>
  <recorded-at type="dateTime">2016-03-12T12:52:07-05:00</recorded-at>
  <contact>
     <id type="integer">302315</id>
     <email>someone@mailnoone.com</email>
     <memberid>1255252</memberid>
  </contact>
 </open>
 <open>
  <account-id>123</account-id>
  <campaign-id type="integer">10000</campaign-id>
  <contact-id type="integer">302326</contact-id>
  <browser>Other</browser>
  <recorded-at type="dateTime">2016-03-13T12:52:07-05:00</recorded-at>
  <contact>
     <id type="integer">302326</id>
     <email>secondopen@mailnoone.com</email>
     <memberid>1255248</memberid>
  </contact>
 </open>
</opens>

我试图将此作为输出

<opens type="array">
 <open>
  <account-id>487</account-id>
  <campaign-id type="integer">504084</campaign-id>
  <contact-id type="integer">396056515</contact-id>
  <browser>Other</browser>
  <recorded-at type="dateTime">2016-03-12T12:52:07-05:00</recorded-at>
  <contact-id type="integer">396056515</id>
  <email>ldrmtrl@mac.com</email>
  <memberid>145773617</memberid>
 </open>
 <open>
  <account-id>123</account-id>
  <campaign-id type="integer">10000</campaign-id>
  <contact-id type="integer">302326</contact-id>
  <browser>Other</browser>
  <recorded-at type="dateTime">2016-03-13T12:52:07-05:00</recorded-at>
  <contact-id type="integer">302326</id>
  <email>secondopen@mailnoone.com</email>
  <memberid>1255248</memberid>
 </open>
</opens>

我的XSLT应该是什么样的? contact元素在每个Open元素中只出现一次。有时可能没有任何开放元素。我看到这个网站中的一些例子很相似,但无法弄清楚这一点。

谢谢, 兰契

1 个答案:

答案 0 :(得分:0)

我想我找到了答案。当我使用以下XSLT时,它会正确加载它。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
 <xsl:template match="*">
  <xsl:element name="{name()}">
   <xsl:copy-of select="@*"/>
   <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>
 <xsl:template match="//contact">
  <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>

如果适用,请提供更好或更快的解决方案。

谢谢, 兰契