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の両方で機能する1つの方法は、テンプレートに、前後の兄弟と同じ@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 に答える