使用PHP连接具有相同节点名的节点值

时间:2014-12-22 03:01:39

标签: php xml

如何使用PHP加入具有相同节点名的节点值? 我的输出:

<SHOP> 
 <SHOPITEM>
  <title>BERMUDY FRANKLIN</title>
  <text>6skladem 3 kusů</text>
  <text>7skladem 8 kusů</text>
  <text>22skladem 33 kusů</text>     
  <unit>0</unit>
 </SHOPITEM>
 <SHOPITEM>
  <title>FRANKLIN 14221</title>
  <text>6skladem 3 kusů</text>
  <text>7skladem 8 kusů</text>    
  <unit>0</unit>
 </SHOPITEM>
</SHOP>

我希望如此:

<SHOP> 
 <SHOPITEM>
  <title>BERMUDY FRANKLIN</title>
  <text>6skladem 3 kusů<br>7skladem 8 kusů<br>22skladem 33 kusů</text>    
  <unit>0</unit>
 </SHOPITEM>
 <SHOPITEM>
  <title>FRANKLIN 14221</title>
  <text>6skladem 3 kusů<br>7skladem 8 kusů</text>  
  <unit>0</unit>
 </SHOPITEM>
</SHOP>

如何改进这个第一块代码的代码?我完全失去了...... thx:

foreach ($items as $item) 
{
    $pieces        = $item->getElementsByTagName("STOREPIECES");
    $sizename      = $item->getElementsByTagName("SIZENAME"); 
    $sizenamevalue = $sizename->item(0)->nodeValue; 
    $piecesvalue   = $pieces->item(0)->nodeValue; 
    $query         = $xpath->query('DESCRIPTION', $item);
    $text          = $query->nodeValue .= $sizenamevalue . 'stock ' . $piecesvalue . ' pc'; 
    $node          = $dom->createElement("text", "$text");
    $item->parentNode->parentNode->appendChild($node);
}

2 个答案:

答案 0 :(得分:1)

您可以使用此XSLT模板:

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

<xsl:output method="xml" encoding="utf-8" />

<xsl:template match="@*|node()">
<xsl:copy>
  <xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>

<xsl:template match="/SHOP/SHOPITEM">
  <xsl:element name="SHOPITEM">
    <title><xsl:value-of select="title" /></title>
    <unit><xsl:value-of select="unit" /></unit>
    <text>
      <xsl:call-template name="join">
        <xsl:with-param name="list" select="text" />
      </xsl:call-template>
    </text>
  </xsl:element>
</xsl:template>

<xsl:template name="join">
  <xsl:param name="list" />
  <xsl:for-each select="$list">
    <xsl:value-of select="." />
    <xsl:if test="position() != last()">
      <br />
    </xsl:if>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

用法:

$xsl_doc = new DOMDocument;
$xsl_doc->loadXML($xsl);

$xml_doc = new DOMDocument;
$xml_doc->loadXML($xml);

$xslt = new XSLTProcessor();
$xslt->importStyleSheet($xsl_doc);

$new_xml_doc = $xslt->transformToDoc($xml_doc);

echo $new_xml_doc->saveXML();

答案 1 :(得分:-1)

取决于你如何形成xml字符串(在每一行的末尾是\ n)你可以做

xml_string.replace('</text><text>', '<br>');

如果行之间有\ n,则应为

xml_string.replace('</text>\n<text>', '<br>');

这可能不是最优雅的解决方案,但它应该可以轻松实现