2

XSLT XML の質問。

単純な変換を検討しています。単純なインデックス xml 入力があります。章ごとに最初と最後の要素を出力する必要があります。以下に示すように。どんな助けでも大歓迎です。

よろしくJJ

入力

<book>
  <page number="1">Chapter01</page> 
  <page number="2">Chapter01</page> 
  <page number="3">Chapter01</page> 
  <page number="4">Chapter01</page> 
  <page number="5">Chapter01</page> 
  <page number="6">Chapter01</page> 
  <page number="7">Chapter02</page> 
  <page number="8">Chapter02</page> 
  <page number="9">Chapter02</page> 
  <page number="10">Chapter02</page> 
  <page number="11">Chapter02</page> 
  <page number="12">Chapter02</page> 
  <page number="13">Chapter03</page> 
  <page number="14">Chapter03</page> 
  <page number="15">Chapter03</page> 
  <page number="16">Chapter03</page> 
  <page number="17">Chapter03</page> 
  <page number="18">Chapter03</page> 
 </book>

出力

<book>
  <page number="1">Chapter01</page>  
  <page number="6">Chapter01</page> 
  <page number="7">Chapter02</page> 
  <page number="12">Chapter02</page> 
  <page number="13">Chapter03</page> 
  <page number="18">Chapter03</page> 
</book>
4

1 に答える 1

3

@SeanB.Durkin のおかげで、よりクリーンな述語を利用するように更新されました。

I. XSLT 1.0 ソリューション

この XSLT の場合:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
  <xsl:output omit-xml-declaration="no" indent="yes" />
  <xsl:strip-space elements="*" />

  <xsl:key name="kChapters" match="page" use="." />

  <xsl:template match="/*">
    <book>
      <xsl:apply-templates 
        select="page[generate-id() = generate-id(key('kChapters', .)[1])]" />
    </book>
  </xsl:template>

  <xsl:template match="page">
    <xsl:copy-of select=".|key('kChapters', .)[last()]" />
  </xsl:template>

</xsl:stylesheet>

...元の XML に適用されます。

<book>
  <page number="1">Chapter01</page>
  <page number="2">Chapter01</page>
  <page number="3">Chapter01</page>
  <page number="4">Chapter01</page>
  <page number="5">Chapter01</page>
  <page number="6">Chapter01</page>
  <page number="7">Chapter02</page>
  <page number="8">Chapter02</page>
  <page number="9">Chapter02</page>
  <page number="10">Chapter02</page>
  <page number="11">Chapter02</page>
  <page number="12">Chapter02</page>
  <page number="13">Chapter03</page>
  <page number="14">Chapter03</page>
  <page number="15">Chapter03</page>
  <page number="16">Chapter03</page>
  <page number="17">Chapter03</page>
  <page number="18">Chapter03</page>
</book>

...目的の結果が生成されます。

<?xml version="1.0"?>
<book>
  <page number="1">Chapter01</page>
  <page number="6">Chapter01</page>
  <page number="7">Chapter02</page>
  <page number="12">Chapter02</page>
  <page number="13">Chapter03</page>
  <page number="18">Chapter03</page>
</book>

説明:

  • を適切に使用して、値によってMuenchian Grouping一意の<page>要素を決定することに注意してください。
  • <page>一意の要素ごと<page>に、一意の値を含むグループの最初と最後の 2 つの要素がコピーされます。

Ⅱ.XSLT 2.0 ソリューション

XSLT 2.0 では、ソリューションがさらに単純になることに注意してください。

この XSLT の場合:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
  <xsl:output omit-xml-declaration="no" indent="yes" />
  <xsl:strip-space elements="*" />

  <xsl:template match="/*">
    <book>
      <xsl:for-each-group select="page" group-by=".">
        <xsl:copy-of select=".|current-group()[last()]" />
      </xsl:for-each-group>
    </book>
  </xsl:template>

</xsl:stylesheet>

...元の XML に適用すると、同じ望ましい結果が生成されます。

<?xml version="1.0"?>
<book>
  <page number="1">Chapter01</page>
  <page number="6">Chapter01</page>
  <page number="7">Chapter02</page>
  <page number="12">Chapter02</page>
  <page number="13">Chapter03</page>
  <page number="18">Chapter03</page>
</book>

説明:

  • 同じ方法論が適用されますが、Muenchian Grouping の代わりに、XSLT 2.0 のfor-each-group要素とcurrent-group()命令が使用されます。
于 2012-10-29T02:27:19.393 に答える