给出以下XML
<stuff>
<div>
<p class="A">...</p>
<p class="B">...</p>
<p class="A">...</p>
<p class="A">...</p>
<p class="B">...</p>
...
</div>
<div>
...
</div>
...
</stuff>
我想为此生成摘要,例如:
<summary>
<classes>
<name>A</name>
<name>B</name>
...
</classes>
<classes>
...
</classes>
...
</summary>
但我无法弄清楚如何枚举p
元素所使用的类。可能还有C
或更多。
什么XSLT 1转换会产生这样的摘要?
编辑:根据下面的TimC’s comment,我实施了以下样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="classes" match="p" use="@class" />
<xsl:template match="stuff">
<summary>
<xsl:apply-templates select="./div" />
</summary>
</xsl:template>
<xsl:template match="div">
<classes>
<xsl:for-each select="p[count(. | key('classes', @class)[1]) = 1]">
<name><xsl:value-of select="@class" /></name>
</xsl:for-each>
</classes>
</xsl:template>
</xsl:stylesheet>
这有点起作用。但是,对于重复的 有没有办法将这样的分组“约束”到单个<div>
元素组,如果在{em>之前的<name>N</name>
组的中看到N
,则不会生成<div>
。< / p>
<div>
组,并按组重复?
答案 0 :(得分:0)
如果你想选择不同的&#34;类&#34;每个div,然后你需要一路来唯一地识别每个div。一种方法是使用$array = json_decode($json, true);
foreach ($item in $array) {
if ($item['id'] == 'randys_sandwich') {
var_dump($item);
break; // Once you've found the item no need to continue the loop
}
}
函数。然后,您可以像这样定义键
generate-id()
因此,只需按<xsl:key name="classes" match="p" use="concat(generate-id(..), '|', @class)" />
属性进行分组,即为父class
试试这个XSLT
div