0

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>
4

1 回答 1

3

在 XSLT1.0 和 2.0 中都可以使用的一种方法是简单地让模板具有将匹配具有相同@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 中,您可以使用带有group-adjacent属性的xsl:for-each-group 。

这个 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>
于 2012-10-29T08:51:28.980 回答