第一个最后一个元素 [英] first last element

查看:64
本文介绍了第一个最后一个元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

XSLT XML 问题.

XSLT XML Question.

研究一个简单的转换.我有简单的索引 xml 输入.我必须为每一章输出第一个和最后一个元素.如下所示.任何帮助将不胜感激.

Looking into a simple transformation. I have simple index xml input. I have to output the the first and last element with a for each chapter. AS shown below. any help will be much appreciated.

问候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>

推荐答案

更新以利用更清晰的谓词 - 感谢 @SeanB.Durkin.

我.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的正确使用确定唯一的 元素的值.
  • 对于每个唯一的 元素,会复制两个 元素:包含唯一值的组中的第一个和最后一个.立>
  • Note the proper use of Muenchian Grouping to determine the unique <page> elements by their value.
  • For each unique <page> element, two <page> elements are copied: the first and last from the group that contains the unique value.

二.XSLT 2.0 解决方案

请注意,在 XSLT 2.0 中,解决方案变得更加简单.

Note that in XSLT 2.0, the solution becomes even simpler.

当这个 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() 指令被使用.
  • The same methodology is applied, but instead of Muenchian Grouping, XSLT 2.0's for-each-group element and current-group() instruction are used.

这篇关于第一个最后一个元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆