Muenchian分组和/ *

时间:2014-03-20 18:06:38

标签: xml xslt xslt-1.0

在XSLT 1.0中使用Muenchian分组。在apply-templates中使用时,它适用于第一个<level>元素,然后无法为其他<level>元素输出。

示例输入XML:请注意<areas>的兄弟姐妹可以是变量

 <levels>
   <level>
     <areas>      
       <p1>A</p1>
       <p1>B</p1>
       <p2>C</p2>
     </areas>      
   </level>
   <level>
     <areas>
       <p3>C</p4>
       <p3>D</p3>
       <p4>E</p4>      
     </areas>
   </level>
 </levels>

示例XSLT:

<xsl:key name="names" match="*/areas/*" use="local-name(.)" />

<xsl:template match="/levels/*">
  <xsl:apply-templates select="./areas/*[generate-id(.)=generate-id(key('names', local-name(.)))]" mode="A" />
</xsl:template>

<xsl:template match="*" mode="A">
  <xsl:variable name="category" select="local-name(.)" />
  <xsl:element name="{$category}">
  </xsl:element>
</xsl:template>

期望的输出:

<p1>
<p2>
<p3>
<p4>

输出返回:

<p1>
<p2>

有关为何忽略第二个<level>元素的任何想法?

感谢。

1 个答案:

答案 0 :(得分:1)

你可以改变

<xsl:template match="/levels/*">
  <xsl:apply-templates select="./areas/*[generate-id(.)=generate-id(key('names', local-name(.)))]" mode="A" />
</xsl:template>

<xsl:template match="/levels">
  <xsl:apply-templates select="level/areas/*[generate-id(.)=generate-id(key('names', local-name(.)))]" mode="A" />
</xsl:template>