gpt4 book ai didi

XSLT 跨节点和文本排序

转载 作者:行者123 更新时间:2023-12-03 15:48:43 29 4
gpt4 key购买 nike

我正在尝试查找、排序并输出一串版权年份。我已经有了一些可用的代码,但我发现我的一些年份与其他年份的标签不同。

一开始我以为我所有的岁月都在下面的标签里:<copyright-year>2020</copyright-year>请参阅下面的一段代码来查找、排序和输出这些内容。

我刚刚发现我的一些版权年份如下所示:<copyright-statement>&#xa9; 2017 Company. All rights reserved.</copyright-statement> .

我可以使用 //copyright-statement/substring(.,3,4) 找到这些语句中的年份。 。但是,当我尝试搜索这两种类型时,如下所示:<xsl:for-each-group select="//copyright-year|copyright-statement/substring(., 3, 4)" group-by="text()"> ,它给出以下警告:

Required item type of document-order sorter is node(); supplied expression ((./copyright-statement)/(fn:substring(...))) has item type xs:string. The expression can succeed only if the supplied value is an empty sequence.

显然是行不通的。知道如何合并这两组年份来获得:<output>2020, 2019, 2017</output>


示例 XML

<?xml version="1.0" encoding="UTF-8"?>
<book>
<book-meta>
<copyright-year>2020</copyright-year>
</book-meta>
<body>
<book-part>
<book-part-meta>
<copyright-year>2019</copyright-year>
</book-part-meta>
</book-part>
</body>
<back>
<copyright-statement>&#xa9; 2017 Company. All rights reserved.</copyright-statement>
</back>
</book>

示例 XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">

<xsl:template match="book">
<xsl:variable name="years">
<xsl:for-each-group select="//copyright-year" group-by="text()">
<xsl:sort select="." order="descending"/>
<xsl:value-of select="."/><xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
</xsl:for-each-group>
</xsl:variable>

<output><xsl:value-of select="$years"/></output>

</xsl:template>
</xsl:stylesheet>

最佳答案

您使用哪个版本的 XSLT 处理器? XSLT 3 具有排序功能

  <xsl:value-of select="reverse(sort(distinct-values((//copyright-year/xs:integer(.), //copyright-statement/xs:integer(substring(.,3,4))))))" separator=", "/>

https://xsltfiddle.liberty-development.net/bwdwsd

使用新的 => 箭头运算符可能会更容易阅读:

  <xsl:value-of 
select="(//copyright-year/xs:integer(.), //copyright-statement/xs:integer(substring(.,3,4)))
=> distinct-values()
=> sort()
=> reverse()"
separator=", "/>

https://xsltfiddle.liberty-development.net/bwdwsd/2

但总的来说,您需要的步骤是简单地确保您使用原子值,例如xs:integers 多年来似乎都是正确的值。我认为在 XSLT 2 中我会将 perform-sort 包装到一个函数中:

  <xsl:function name="mf:sort" as="item()*">
<xsl:param name="input" as="item()*"/>
<xsl:perform-sort select="$input">
<xsl:sort order="descending"/>
</xsl:perform-sort>
</xsl:function>

<xsl:template match="book">
<xsl:value-of select="mf:sort(distinct-values((//copyright-year/xs:integer(.), //copyright-statement/xs:integer(substring(.,3,4)))))" separator=", "/>
</xsl:template>

https://xsltfiddle.liberty-development.net/bwdwsd/1

关于XSLT 跨节点和文本排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59146147/

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