gpt4 book ai didi

xslt - xsl :sort by variable

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

我一直在查看有关使用 <xsl:sort> 对 XML 进行排序的线程和变量,但仍然无法让我的排序工作。下面是上下文的一些 XML 结构:

<records>
<record>
<contributors>
<authors>
<author>Author 1</author>
<author>Author 2</author>
</authors>
</contributors>
<titles>
<title>I'm a Title!</title>
<secondary-title></secondary-title>
</titles>
<dates>
<year>1901</year>
</dates>
</record>
<record>...</record>
<record>...</record>
</records>

这是相关的 XSL:

<xsl:variable name="sortby" 
select="contributors/authors/author[1]" as="element()*"/>
<xsl:for-each select="//record">
<xsl:sort select="$sortby" order="ascending"/>
[a bunch of HTML to render the records as a bibliography]
</xsl:for-each>

如果我复制变量“选择”属性中的字符串并将其粘贴到排序中,如下所示:

<xsl:sort select="contributors/authors/author[1]" order="ascending">

然后就可以了。对于变量,它没有。我在有和没有 as="element()*" 的情况下都试过了-- 帮助?

最佳答案

通常不可能执行 XPath 表达式的动态计算——无论是在 XSLT/Xpath 1.0 还是在 XSLT/Xpath 2.0

也就是说,如果对变量的内容有一些限制,那么总是可以实现由变量引导的排序。

这是解决您的特定问题和一类类似问题的示例:

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

<xsl:param name="pSortName" select="'authors'"/>
<xsl:param name="pSortPosition" select="1"/>

<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<xsl:template match="records">
<records>
<xsl:apply-templates>
<xsl:sort select=
".//*[name()=$pSortName]/*
[position()=$pSortPosition]"/>
</xsl:apply-templates>
</records>
</xsl:template>
</xsl:stylesheet>

当此转换应用于此 XML 文档时:

<records>
<record>
<contributors>
<authors>
<author>X.Y.Z</author>
<author>A.B.C</author>
</authors>
</contributors>
<titles>
<title>Title B</title>
<secondary-title>Title AB</secondary-title>
</titles>
<dates>
<year>1901</year>
</dates>
</record>
<record>
<contributors>
<authors>
<author>T.U.V</author>
<author>D.E.F</author>
</authors>
</contributors>
<titles>
<title>Title A</title>
<secondary-title>Title BA</secondary-title>
</titles>
<dates>
<year>2001</year>
</dates>
</record>
</records>

生成了想要的正确结果(按第一作者排序的记录):

<records>
<record>
<contributors>
<authors>
<author>T.U.V</author>
<author>D.E.F</author>
</authors>
</contributors>
<titles>
<title>Title A</title>
<secondary-title>Title BA</secondary-title>
</titles>
<dates>
<year>2001</year>
</dates>
</record>
<record>
<contributors>
<authors>
<author>X.Y.Z</author>
<author>A.B.C</author>
</authors>
</contributors>
<titles>
<title>Title B</title>
<secondary-title>Title AB</secondary-title>
</titles>
<dates>
<year>1901</year>
</dates>
</record>
</records>

如果我们将参数更改为:

 <xsl:param name="pSortName" select="'authors'"/>
<xsl:param name="pSortPosition" select="2"/>

然后转换使用第二个 author 作为排序键进行排序。

如果我们将参数更改为:

 <xsl:param name="pSortName" select="'titles'"/>
<xsl:param name="pSortPosition" select="1"/>

然后转换使用 titles/title 元素 作为排序键进行排序。

如果我们将参数更改为:

 <xsl:param name="pSortName" select="'titles'"/>
<xsl:param name="pSortPosition" select="2"/>

然后转换使用 titles/secondary-title 元素 作为排序键进行排序。

请注意:这里我们假设任何被排序的元素都有一个唯一的后代,其名称等于 pSortName 中指定的值。我们还假设此元素具有子元素,并且 pSortPosition 指定要用作排序键的子元素的位置。

关于xslt - xsl :sort by variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4834266/

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