gpt4 book ai didi

php - 需要借助 xsl/xslt 将重复的 XML 节点放在单独的节点中

转载 作者:可可西里 更新时间:2023-11-01 01:11:22 26 4
gpt4 key购买 nike

我有这个 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 and size-qty 在每个产品节点。任何帮助将不胜感激。

我已经尝试过 xsl 复制的各种变体 - for-each 循环和其他东西,但大多数在解析后没有打印任何东西,打印相同的文档或存在其他问题。我猜问题是我正在使用的路径(xpaths?)。

最佳答案

只是为了展示另一种对相邻项进行分组或从 XSLT 1.0 中的内容开始的方法,此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*" name="shallow-copy">
<xsl:copy>
<xsl:apply-templates select="node()[1]|@*"/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>

<xsl:template match="size">
<variation>
<xsl:call-template name="group-starting-with"/>
</variation>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>

<xsl:template match="color-code|size-code|size-qty|size-codeproducer">
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>

<xsl:template match="node()" mode="group-starting-with"
name="group-starting-with">
<xsl:copy>
<xsl:apply-templates select="node()[1]|@*"/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::node()[1]"
mode="group-starting-with"/>
</xsl:template>

<xsl:template match="size|imgs" mode="group-starting-with"/>
</xsl:stylesheet>

输出

<products> 
<product>
<name>ad</name>
<category>something</category>
<path>something</path>
<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>
<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>
<url>google.com</url>
<price>7.98</price>
<brand>NIKE</brand>
<color>black</color>
<gender>Man</gender>
</product>
<product>... ... ...</product>
</products>

请注意:这是在以下斧头中遍历。这意味着每条规则都负责将模板应用于第一个 child 和第一个后续 sibling 。对于分组,您需要一个具有匹配标准的规则开始,空规则在不匹配标准时停止,并在标准匹配但您不分组时绕过规则。

关于php - 需要借助 xsl/xslt 将重复的 XML 节点放在单独的节点中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55713750/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com