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

Php 如何将嵌套XML转换为简单XML,php,xml,xslt,transformation,Php,Xml,Xslt,Transformation,首先,几天来我一直在寻找这个问题的答案,但都没有用——但是在处理了多年的原始.net之后,自学有一些挑战,如果这是一个非常基本的问题,那么很抱歉 两个问题: XSLT或手动循环,或 我错过了什么 我试图在不使用任何附加库的情况下转换嵌套XML文档的“Items”元素: example.xml: 1. 拿铁 $ 4.50 0.50 豆浆 1. 0 糖 2. 转换为带有一些文本缩进的平面版本 ^^^ preceding text bits ^^^ <line> 1

首先,几天来我一直在寻找这个问题的答案,但都没有用——但是在处理了多年的原始.net之后,自学有一些挑战,如果这是一个非常基本的问题,那么很抱歉

两个问题:

  • XSLT或手动循环,或
  • 我错过了什么
  • 我试图在不使用任何附加库的情况下转换嵌套XML文档的“Items”元素:

    example.xml:

    
    1.
    拿铁
    $  4.50
    0.50
    豆浆
    1.
    0
    糖
    2.
    
    转换为带有一些文本缩进的平面版本

    ^^^ 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 ---
    
    ^^^^前面的文本位^^
    一杯拿铁4.50美元
    1倍豆浆(0.50)
    2倍糖(0.00)
    ----继续其他位---
    
    我肯定我错过了一些东西,因为这应该很容易,但我要花很长时间才能让它发挥作用:

    $xml = simplexml_load_file('<<source file>>');
    foreach($xml->Items->children() as $child)
      {
        echo '<text> ' . $child->qty . '  ' . $child->Name . '    ' . $child->Cost . '</text>';
      }
    
    $xml=simplexml\u load\u文件(“”);
    foreach($xml->Items->children()作为$child)
    {
    回显'.$child->qty'.$child->Name'.$child->Cost'.';
    }
    

    所以我很确定我陷入了一个非常简单的新手错误。

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

    flatte.xsl

    哪些产出:

    
    一杯拿铁4.50美元
    1份豆浆0.50
    2倍糖0.00
    
    您确定您在这里谈论的是XML,而不是您在这里或那里陷入了空白规范化规则?谢谢@hek2mgl你下面的回答太棒了-非常感谢我想我可以测量出这导致的额外秃顶:-)嗨@hakre-谢谢你提醒我一个可能的问题,一个我不知道为什么的问题。这就是为什么我使用$symbol来包装这些值-这是一个很好的提示(当然是对于像我这样的新玩家:-\)没问题。。问题是你为什么需要这个?一个只有
    元素的xml文档没有多大意义,一个简单的文本文件是合适的,不是吗?Hi@hek2mgl主要原因是数据从一个(标准化的)系统移动到另一个(非标准化的)系统-谁知道为什么一个系统会将其非标准化。最终的结果是一个收据的PDF,因此它可能只是选择只循环
    元素,而不是解析一个通用的XML文档。
    $xml = simplexml_load_file('<<source file>>');
    foreach($xml->Items->children() as $child)
      {
        echo '<text> ' . $child->qty . '  ' . $child->Name . '    ' . $child->Cost . '</text>';
      }
    
    <?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>
    
    $xml = new DOMDocument();
    $xsl = new DOMDocument();
    
    $xml->load("example.xml");
    $xsl->load("flatten.xsl");
    
    $xsltproc  = new XSLTProcessor();
    $xsltproc->importStyleSheet($xsl);
    
    echo $xsltproc->transformToXML($xml);