如何将嵌套XML转换为简单的XML

时间:2014-07-06 12:36:08

标签: php xml xslt transformation

首先,我已经扫描了几天这个问题的答案,但没有用 - 但是在处理了多年的原始网络之后自我教学有一些挑战,很抱歉,如果这是一个非常基本的问题。

两个问题:

  1. XSLT或手动循环,或
  2. 我错过了什么......?
  3. 我试图转换'项目'嵌套XML文档的元素,没有任何其他库:

    的example.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <Order>
      <stuff></stuff>
      <Items>
        <OrderItem>
          <qty>1</qty>
          <Name>Latte</Name>
          <Cost>$  4.50</Cost>
          <Options ID="1">
            <Cost>0.50</Cost>
            <Name>Soy Milk</Name>
            <QTY>1</QTY>
          </Options>
          <Options ID="2">
            <Cost>0.00</Cost>
            <Name>Sugar</Name>
            <QTY>2</QTY>
          </Options>
        </OrderItem>
      </Items>
      <MoreStuff></MoreStuff>
    </Order>
    

    进入带有一些文字缩进的平面版本

    ^^^ preceding text bits ^^^   
    <line>    1   Latte                   $4.50 </line>
    <line>           1 x Soy Milk (0.50)        </line>
    <line>           2 x Sugar    (0.00)        </line>
    ---- continue for other bits ---
    

    我确定我错过了一些东西,因为这应该很容易,但是我有一段时间可以让它工作:

    $xml = simplexml_load_file('<<source file>>');
    foreach($xml->Items->children() as $child)
      {
        echo '<text> ' . $child->qty . '  ' . $child->Name . '    ' . $child->Cost . '</text>';
      }
    

    所以我很确定我会遇到一个非常简单的新错误。

1 个答案:

答案 0 :(得分:1)

我会使用XSLT。拥有以下样式表:

flatten.xsl

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:for-each select="/Order/Items/OrderItem">
        <line>
            <xsl:text>    </xsl:text>
            <xsl:value-of select="qty" />
            <xsl:text>   </xsl:text>
            <xsl:value-of select="Name" />
            <xsl:text>   </xsl:text>
            <xsl:value-of select="Cost" />
            <xsl:text>   </xsl:text>
        </line>
            <xsl:for-each select="Options"><xsl:text>
</xsl:text>
        <line>
            <xsl:text>       </xsl:text>
            <xsl:value-of select="QTY" />
            <xsl:text> x </xsl:text>
            <xsl:value-of select="Name" />
            <xsl:text>   </xsl:text>
            <xsl:value-of select="Cost" />
            <xsl:text>   </xsl:text>
        </line>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

您可以使用PHP中的以下代码应用上述样式表:

$xml = new DOMDocument();
$xsl = new DOMDocument();

$xml->load("example.xml");
$xsl->load("flatten.xsl");

$xsltproc  = new XSLTProcessor();
$xsltproc->importStyleSheet($xsl);

echo $xsltproc->transformToXML($xml);

输出:

<?xml version="1.0"?>
<line>    1   Latte   $  4.50   </line>
<line>       1 x Soy Milk   0.50   </line>
<line>       2 x Sugar   0.00   </line>