编程语言
首页 > 编程语言> > PHP-需要在xsl / xslt的帮助下将重复的XML节点放在单独的节点中

PHP-需要在xsl / xslt的帮助下将重复的XML节点放在单独的节点中

作者:互联网

我有这个xml:

<products>
 <product>
 <name>ad</name>
 <category>something</category>
 <path>something</path>
    <size>S</size>
    <color-code>87-3</color-code>
    <size-code>24294</size-code>
    <size-qty>10</size-qty>
    <size-codeproducer>5902228002604</size-codeproducer>
    <size>M</size>
    <color-code>87-4</color-code>
    <size-code>24295</size-code>
    <size-qty>64</size-qty>
    <size-codeproducer>5902228002611</size-codeproducer>
    <size>L</size>
    <color-code>87-5</color-code>
    <size-code>24296</size-code>
    <size-qty>46</size-qty>
    <size-codeproducer>5902228002628</size-codeproducer>
    <size>XXL</size>
    <color-code>87-7</color-code>
    <size-code>24298</size-code>
    <size-qty>0</size-qty>
    <size-codeproducer>5902228002635</size-codeproducer>
    <imgs>
      <img>pictures/large/7/8/87_2.jpg</img>
      <img>pictures/large/7/8/87_1.jpg</img>
      <img>pictures/large/7/8/87_4.jpg</img>
      <img>pictures/large/7/8/87_5.jpg</img>
      <img>pictures/large/7/8/87_3.jpg</img>
      <img>pictures/large/7/8/87_6.jpg</img>
    </imgs>google.com</url>
    <price>7.98</price>
    <brand>NIKE</brand>
    <color>black</color>
    <gender>Man</gender>
  </product>
  <product>
  ...
  ...
  ...
  </product>
</products>

我需要的:

<products>
<product>
<name>ad</name>
<category>something</category>
...
<variation>
   <size>S</size>
   <color-code>87-3</color-code>
   <size-code>24294</size-code>
   <size-qty>10</size-qty>
   <size-codeproducer>5902228002604</size-codeproducer>
</variation>
<variation>
   <size>M</size>
   <color-code>87-4</color-code>
   <size-code>24295</size-code>
   <size-qty>64</size-qty>
   <size-codeproducer>5902228002611</size-codeproducer>
</variation>
<variation>
   <size>L</size>
   <color-code>87-5</color-code>
   <size-code>24296</size-code>
   <size-qty>46</size-qty>
   <size-codeproducer>5902228002628</size-codeproducer>
</variation>
<variation>
   <size>XXL</size>
   <color-code>87-7</color-code>
   <size-code>24298</size-code>
   <size-qty>0</size-qty>
   <size-codeproducer>5902228002635</size-codeproducer>
</variation>
</product>
<product>
...
</product>
</products>

我有这个xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

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

     <xsl:template match="/products/product">

        <xsl:copy>
            <xsl:copy-of select="description|id|name|category|path"/>
            <xsl:for-each select="/products/product/size">
                <variation>
                    <xsl:variable name="occur" select="position()"/>
                    <xsl:copy-of select="."/>
                    <xsl:copy-of select="/products/product/color-code[$occur]"/>
                    <xsl:copy-of select="/products/product/size-code[$occur]"/>
                    <xsl:copy-of select="/products/product/size-qty[$occur]"/>
                    <xsl:copy-of select="/products/product/size-codeproducer[$occur]"/>
                </variation>
            </xsl:for-each>
            <xsl:copy-of select="imgs|url|price|brand|color|gender"/>
        </xsl:copy>

     </xsl:template>
</xsl:stylesheet>

结果是复制的xml文件
每个产品节点中的size-codeproducer,color-code,size-code和size-qty.
任何帮助,将不胜感激.

我尝试了xsl复制的各种变体-for-each循环和其他功能,但是大多数解析后都没有打印任何内容,没有打印相同的文档,或者还有其他问题.我猜问题出在我正在使用的路径(xpaths?)上.

解决方法:

首先,您的xsl:for-each有问题…

<xsl:for-each select="/products/product/size">

通过以代表文档节点的/开头的选择表达式,您实际上在进行绝对搜索,而忽略了当前位于的产品.您只需执行此操作即可获取当前产品的尺寸元素

<xsl:for-each select="size">

同样,对于各种xsl:copy-of语句,请不要这样做…

<xsl:copy-of select="/products/product/color-code[$occur]"/>

您应该这样做(..获取当前size元素的父元素)

<xsl:copy-of select="../color-code[$occur]"/>

试试这个模板

 <xsl:template match="/products/product">
    <xsl:copy>
        <xsl:copy-of select="description|id|name|category|path"/>
        <xsl:for-each select="size">
            <variation>
                <xsl:variable name="occur" select="position()"/>
                <xsl:copy-of select="."/>
                <xsl:copy-of select="../color-code[$occur]"/>
                <xsl:copy-of select="../size-code[$occur]"/>
                <xsl:copy-of select="../size-qty[$occur]"/>
                <xsl:copy-of select="../size-codeproducer[$occur]"/>
            </variation>
        </xsl:for-each>
        <xsl:copy-of select="imgs|url|price|brand|color|gender"/>
    </xsl:copy>
 </xsl:template>

(请注意,您也可以在此处执行< xsl:copy-of select =“ following-sibling :: color-code [1]” /&gt ;,对于其他语句也是如此).

标签:xml,xslt,php,xslt-1-0
来源: https://codeday.me/bug/20191108/2005708.html