第一个元素第二个变体

时间:2012-10-29 05:16:38

标签: xml xslt

XSLT XML问题。

我还有上一个问题的另一种变体。我必须输出每个部分的第一页和最后一页元素。如下所示。

非常感谢XSLT 1.0解决方案和XSLT 2.0解决方案。我提前感谢您的时间和帮助。

谢谢JJ。

输入:

<root>
  <page number="1" section="Arsenal">Arsenal</page> 
  <page number="2" section="Arsenal">Arsenal</page> 
  <page number="3" section="Arsenal">Arsenal</page> 
  <page number="4" section="Arsenal">Arsenal</page> 
  <page number="5" section="Arsenal">Arsenal</page> 
  <page number="6" section="Arsenal">Arsenal</page> 
  <page number="7" section="Chelsea">Chelsea</page> 
  <page number="8" section="Chelsea">Chelsea</page> 
  <page number="9" section="Chelsea">Chelsea</page> 
  <page number="10" section="Chelsea">Chelsea</page> 
  <page number="11" section="Chelsea">Chelsea</page> 
  <page number="12" section="Chelsea">Chelsea</page> 
  <page number="13" section="ManUnited">ManUnited</page> 
  <page number="14" section="ManUnited">ManUnited</page> 
  <page number="15" section="ManUnited">ManUnited</page> 
  <page number="16" section="ManUnited">ManUnited</page> 
  <page number="17" section="ManUnited">ManUnited</page> 
  <page number="18" section="ManUnited">ManUnited</page> 
  <page number="19" section="ManCity">ManCity</page> 
  <page number="20" section="ManCity">ManCity</page> 
  <page number="21" section="ManCity">ManCity</page> 
  <page number="22" section="ManCity">ManCity</page> 
  <page number="23" section="ManCity">ManCity</page> 
  <page number="24" section="ManCity">ManCity</page>
  <page number="25" section="Arsenal">Arsenal</page> 
  <page number="26" section="Arsenal">Arsenal</page> 
  <page number="27" section="Arsenal">Arsenal</page> 
  <page number="28" section="Arsenal">Arsenal</page> 
  <page number="29" section="Arsenal">Arsenal</page>   
 </root>

输出:

 <root>
  <page number="1" section="Arsenal">Arsenal</page> 
  <page number="6" section="Arsenal">Arsenal</page> 
  <page number="7" section="Chelsea">Chelsea</page> 
  <page number="12" section="Chelsea">Chelsea</page> 
  <page number="13" section="ManUnited">ManUnited</page> 
  <page number="18" section="ManUnited">ManUnited</page> 
  <page number="19" section="ManCity">ManCity</page> 
  <page number="24" section="ManCity">ManCity</page>
  <page number="25" section="Arsenal">Arsenal</page> 
  <page number="29" section="Arsenal">Arsenal</page> 
 </root>

1 个答案:

答案 0 :(得分:3)

一种适用于XSLT1.0和2.0的方法是让模板匹配页面元素,这些元素具有与 @section 相同的 @section 属性大多数前后兄弟姐妹

<xsl:template match="page
    [@section = preceding-sibling::page[1]/@section]
    [@section = following-sibling::page[1]/@section]" />

这是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="page[@section = preceding-sibling::page[1]/@section][@section = following-sibling::page[1]/@section]" />

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

当应用于输入XML时,输出以下内容

<root>
   <page number="1" section="Arsenal">Arsenal</page>
   <page number="6" section="Arsenal">Arsenal</page>
   <page number="7" section="Chelsea">Chelsea</page>
   <page number="12" section="Chelsea">Chelsea</page>
   <page number="13" section="ManUnited">ManUnited</page>
   <page number="18" section="ManUnited">ManUnited</page>
   <page number="19" section="ManCity">ManCity</page>
   <page number="24" section="ManCity">ManCity</page>
   <page number="25" section="Arsenal">Arsenal</page>
   <page number="29" section="Arsenal">Arsenal</page>
</root>

仅在XSLT2.0中,您可以将 xsl:for-each-group group-adjacent 属性结合使用。

此XSLT也应生成相同的输出

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="root">
      <xsl:for-each-group select="page" group-adjacent="@section">
         <xsl:apply-templates select="current-group()[1]|current-group()[last()]"/>
      </xsl:for-each-group>
   </xsl:template>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>