为类摘要收集元素的类属性

时间:2017-04-18 10:13:20

标签: xml xslt xslt-1.0

给出以下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>组,并按组重复?

1 个答案:

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

添加唯一ID

试试这个XSLT

div