【问题标题】:XML transform to other XMLXML 转换为其他 XML
【发布时间】:2021-01-18 05:21:04
【问题描述】:

每天我都需要将格式从 XML(A) 转换为 XML(B) 并将新的 XML 保存在服务器上。如何最好地存档?

想法是:

  • 使用 PHP 提取 XML(A) 并保存到 MySQL 数据库。打印出新的 XML(B)。
  • 使用 PHP 加载 XML(A) 并转换为 XML(B)

有人可以展示将 XML 标记转换为另一个标记或属性的示例吗?

这里是 XML (A)

<?xml version="1.0" encoding="UTF-8"?>
<EventList><!--Movie description-->
   <listmovies>
      <Movie No="9111">
         <Name>filmtitle</Name>
         <Imagepath>imagepic1.jpg</Imagepath>
         <Synopsis>Cowboy og Indianer planlægger en surprise fødselsdagsfest for Hest, men ender ud i store
                problemer da de bestiller 50 mio. mursten til barbecuegrillen, i stedet for 50. Det bliver starten på en forunderlig rejse hvor trioen rejser til Jordens midte. Kilde: Angel Distribution
      </Synopsis>
      </Movie>
   </listmovies>
   <!--Event description-->
   <Event No="0003" MovieNo="9111">
      <Period>
         <Start Date="153677" Time="44400">2020-10-02T12:20:00+02:00</Start>
      </Period>
   </Event>
</EventList>

要达到的结果。 XML (B)

<?xml version="1.0" encoding="UTF-8"?>
<!-- Movie description -->
<FluxAgenda>
   <Film id="9111"
         titre="filmtitle"
         resume="Cowboy og Indianer planlægger en surprise fødselsdagsfest for Hest, men ender ud i store problemer da de bestiller 50 mio. mursten til barbecuegrillen, i stedet for 50. Det bliver starten på en forunderlig rejse hvor trioen rejser til Jordens midte. Kilde: Angel Distribution"/>
   <!-- Event description -->
   <EvenementSimple id="0003" dateFin="153677">
      <Horaires>
         <Date date="2020-10-02" heure="12:20"/>
      </Horaires>
   </EvenementSimple>
   <Affiches>
      <Photo url="imagepic1.jpg" filmId="9111"/>
   </Affiches>
</FluxAgenda>

【问题讨论】:

  • 非常感谢,这项工作。 一个后续问题 @Parfait 如果我在父节点中有多个子节点怎么办? &lt;Event No="0003" MovieNo="9111"&gt;&lt;Period&gt;.....&lt;/Period&gt;&lt;Period&gt;.....&lt;/Period&gt;&lt;Period&gt;.....&lt;/Period&gt;&lt;/Event&gt;
  • 再一次,请在已发布的答案(不是我的评论)下回复@Sebastien 的answer 而不是我。

标签: php xml xslt transform


【解决方案1】:

您可以对输入 XML 使用简单的 XSLT 转换来获得所需的输出:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="EventList">
    <FluxAgenda>
        <xsl:apply-templates select="listmovies/Movie"/>
        <xsl:apply-templates select="Event"/>
        <xsl:apply-templates select="listmovies/Movie/Imagepath"/>
    </FluxAgenda>
  </xsl:template>
  
  <xsl:template match="Movie">
      <Film id="{@No}" titre="{Name}" resume="{Synopsis}"/>
  </xsl:template>
  
  <xsl:template match="Event">
      <EvenementSimple id="{@No}" dateFin="{Period/Start/@Date}">
          <Horaires>
            <xsl:apply-templates select="Period"/>
          </Horaires>
      </EvenementSimple>
  </xsl:template>
  
  <xsl:template match="Period">
        <Date date="{substring(Start,1,10)}" heure="{substring(Start,12,5)}"/>
  </xsl:template>
  
  <xsl:template match="Imagepath">
      <Affiches>
          <Photo url="{.}" filmId="{../../Movie/@No}"/>
      </Affiches>
  </xsl:template>
  
</xsl:stylesheet>

在这里查看它的工作原理:https://xsltfiddle.liberty-development.net/aixRuu/25

【讨论】:

  • PHP 可以运行带有 XSL 模块的 XSLT 1.0 脚本:php.net/manual/en/xsltprocessor.transformtoxml.php
  • 谢谢,我会调查的!
  • 如果我在一个父节点中有多个子节点怎么办??? &lt;Event No="0003" MovieNo="9111"&gt;&lt;Period&gt;.....&lt;/Period&gt;&lt;Period&gt;.....&lt;/Period&gt;&lt;Period&gt;.....&lt;/Period&gt;&lt;/Event&gt;
  • 非常感谢,它帮助了 :)
猜你喜欢
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多