douna3367 2014-12-22 03:01
浏览 72
已采纳

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

How to join node value which have same node name with PHP? My output:

<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>

And i wish this:

<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>

How improve this code which do first block of code? I am totaly lost..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条回答 默认 最新

  • duanpei8518 2014-12-22 03:34
    关注

    You can use this XSLT template:

    <?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>
    

    Usage:

    $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条)

报告相同问题?

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分