gpt4 book ai didi

xml - 第一个最后一个元素

转载 作者:行者123 更新时间:2023-12-04 05:26:49 25 4
gpt4 key购买 nike

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>

最佳答案

更新以利用更清晰的谓词 - 感谢 @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 确定唯一性<page>元素按其值。
  • 对于每个独特的 <page>元素,两个 <page>元素被复制:包含唯一值的组中的第一个和最后一个。


  • 二、 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()指令被使用。
  • 关于xml - 第一个最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13114907/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com