Я сильно рекомендуем вам выяснить в XSLT решение - Glenn Джекман
Я могу только второй это. Итак, вот ваше решение XSLT. Однако возникает вопрос: вы показали представителя образец XML или есть несколько разных PRODUCT
элементов в ваших действительных данных XML?
Кроме того, элементы именования CODE1
, CODE2
и т. Д. Могут быть выполнены, но я бы (опять же, настоятельно) рекомендую не делать этого. Я рад добавить эту деталь, но сначала выяснить, если вы действительно нужны это повреждая соглашение об именах или, если вы можете использовать атрибуты вместо:
<CODE n="1"/>
XML Input
Как предложил Гленн уже, должен быть один внешний элемент, чтобы сделать ваш вход хорошо сформированный XML.
<root>
<SHOPITEM>
<PRODUCT>POINT</PRODUCT>
<FRAMESIZE>MD</FRAMESIZE>
<CODE>029,00</CODE>
<COLOR>black/yellow</COLOR>
</SHOPITEM>
<SHOPITEM>
<PRODUCT>POINT</PRODUCT>
<FRAMESIZE>LD</FRAMESIZE>
<CODE>029,01</CODE>
<COLOR>black/yellow</COLOR>
</SHOPITEM>
<SHOPITEM>
<PRODUCT>POINT</PRODUCT>
<FRAMESIZE>LD</FRAMESIZE>
<CODE>029,03</CODE>
<COLOR>green/white</COLOR>
</SHOPITEM>
<SHOPITEM>
<PRODUCT>POINT</PRODUCT>
<FRAMESIZE>MD</FRAMESIZE>
<CODE>029,04</CODE>
<COLOR>green/white</COLOR>
</SHOPITEM>
</root>
таблицы стилей XSLT (1,0)
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="/root">
<SHOPITEM>
<xsl:copy-of select="SHOPITEM[1]/PRODUCT"/>
<xsl:copy-of select="SHOPITEM/*[not(self::PRODUCT)]"/>
</SHOPITEM>
</xsl:template>
</xsl:transform>
XML-выход
<SHOPITEM>
<PRODUCT>POINT</PRODUCT>
<FRAMESIZE>MD</FRAMESIZE>
<CODE>029,00</CODE>
<COLOR>black/yellow</COLOR>
<FRAMESIZE>LD</FRAMESIZE>
<CODE>029,01</CODE>
<COLOR>black/yellow</COLOR>
<FRAMESIZE>LD</FRAMESIZE>
<CODE>029,03</CODE>
<COLOR>green/white</COLOR>
<FRAMESIZE>MD</FRAMESIZE>
<CODE>029,04</CODE>
<COLOR>green/white</COLOR>
</SHOPITEM>
РЕДАКТИРОВАТЬ:
То, что я пропустил, что есть много разных элементов, как спросил Матиас.
XML Input
Более разумный образец для тестирования, с более чем одним PRODUCT
:
<root>
<SHOPITEM>
<PRODUCT>POINT</PRODUCT>
<FRAMESIZE>MD</FRAMESIZE>
<CODE>029,00</CODE>
<COLOR>black/yellow</COLOR>
</SHOPITEM>
<SHOPITEM>
<PRODUCT>POINT</PRODUCT>
<FRAMESIZE>LD</FRAMESIZE>
<CODE>029,01</CODE>
<COLOR>black/yellow</COLOR>
</SHOPITEM>
<SHOPITEM>
<PRODUCT>OTHER</PRODUCT>
<FRAMESIZE>LD</FRAMESIZE>
<CODE>029,03</CODE>
<COLOR>green/white</COLOR>
</SHOPITEM>
<SHOPITEM>
<PRODUCT>OTHER</PRODUCT>
<FRAMESIZE>MD</FRAMESIZE>
<CODE>029,04</CODE>
<COLOR>green/white</COLOR>
</SHOPITEM>
</root>
Stylesheet
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:key name="prod" match="SHOPITEM" use="PRODUCT"/>
<xsl:template match="/root">
<xsl:copy>
<xsl:for-each select="SHOPITEM[generate-id() = generate-id(key('prod',PRODUCT)[1])]">
<SHOPITEM>
<xsl:copy-of select="PRODUCT"/>
<xsl:copy-of select="/root/SHOPITEM[PRODUCT = current()/PRODUCT]/*[not(self::PRODUCT)]"/>
</SHOPITEM>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:transform>
XML Output
<root>
<SHOPITEM>
<PRODUCT>POINT</PRODUCT>
<FRAMESIZE>MD</FRAMESIZE>
<CODE>029,00</CODE>
<COLOR>black/yellow</COLOR>
<FRAMESIZE>LD</FRAMESIZE>
<CODE>029,01</CODE>
<COLOR>black/yellow</COLOR>
</SHOPITEM>
<SHOPITEM>
<PRODUCT>OTHER</PRODUCT>
<FRAMESIZE>LD</FRAMESIZE>
<CODE>029,03</CODE>
<COLOR>green/white</COLOR>
<FRAMESIZE>MD</FRAMESIZE>
<CODE>029,04</CODE>
<COLOR>green/white</COLOR>
</SHOPITEM>
</root>
Я не знаком с этой темой. Возможно, это поможет вам: https://en.wikipedia.org/wiki/XSLT и http://php.net/manual/en/class.xsltprocessor.php – Cyrus