xslt - 如何组相邻 - XSLT
问题描述
如果前一年相同的文本下一段然后分组移动到降序例如 移动到该文本之后,AFL-CIO v Unemployment Ins. Appeals Bd. (1994), AFL-CIO v Unemployment Ins. Appeals Bd. (1996)
如何分组相邻。输入 XMLATPAC,
ATS Prods., Inc. v Champion Fiberglass,
<root>
<p content-type="emLetHead">A</p>
<p content-type="emCase"><named-content content-type="emEntry">A.M. v Albertsons, LLC (2009) 178 CA4th 455:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">ABBA Rubber Co. v Seaquist (1991) 235 CA3d 1:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">ABC Int’l Traders, Inc. v Matsushita Elec. Corp. (1997) 14 C4th 1247:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">AFL-CIO v Unemployment Ins. Appeals Bd. (1994) 23 CA4th 51:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">AFL-CIO v Unemployment Ins. Appeals Bd. (1996) 13 C4th 1017:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">ATPAC, Inc. v Aptitude Solutions, Inc. (ED Cal, Apr. 29, 2010, No. CIV. 2:10–294 WBS KJM) 2010 US Dist Lexis 42109:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">ATS Prods., Inc. v Champion Fiberglass, Inc. (ND Cal, Jan. 15, 2015, No. 13–cv–02403–SI) 2015 US Dist Lexis 5106:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">ATS Prods., Inc. v Champion Fiberglass, Inc. (ND Cal, Nov. 19, 2013, No. C 13-02403 SI) 2013 US Dist Lexis 13886:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">Abadia-Peixoto v U.S. Dep’t of Homeland Sec. (ND Cal, Aug. 23, 2013, No. 11-cv-04001 RS (KAW)) 2013 US Dist Lexis 120368:</named-content></p>
</root>
XSL 代码
<xsl:template match="root">
<xsl:copy>
<xsl:for-each-group select="p" group-adjacent="named-content[@content-type='emEntry']">
<xsl:choose>
<xsl:when test="current-grouping-key()">
<xsl:apply-templates select="current-group()">
<xsl:sort select="number(contains(named-content[@content-type='emEntry'], '(.+)\(([0-9]+)'))" data-type="number" order="descending"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
预期产出
<root>
<p content-type="emLetHead">A</p>
<p content-type="emCase"><named-content content-type="emEntry">A.M. v Albertsons, LLC (2009) 178 CA4th 455:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">ABBA Rubber Co. v Seaquist (1991) 235 CA3d 1:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">ABC Int’l Traders, Inc. v Matsushita Elec. Corp. (1997) 14 C4th 1247:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">AFL-CIO v Unemployment Ins. Appeals Bd. (1996) 13 C4th 1017:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">AFL-CIO v Unemployment Ins. Appeals Bd. (1994) 23 CA4th 51:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">ATS Prods., Inc. v Champion Fiberglass, Inc. (ND Cal, Jan. 15, 2015, No. 13–cv–02403–SI) 2015 US Dist Lexis 5106:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">ATS Prods., Inc. v Champion Fiberglass, Inc. (ND Cal, Nov. 19, 2013, No. C 13-02403 SI) 2013 US Dist Lexis 13886:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">ATPAC, Inc. v Aptitude Solutions, Inc. (ED Cal, Apr. 29, 2010, No. CIV. 2:10–294 WBS KJM) 2010 US Dist Lexis 42109:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">Abadia-Peixoto v U.S. Dep’t of Homeland Sec. (ND Cal, Aug. 23, 2013, No. 11-cv-04001 RS (KAW)) 2013 US Dist Lexis 120368:</named-content></p>
</root>
解决方案
我认为您想在 之前对子字符串上的相邻元素进行分组(
,然后您想提取年份以在组内进行排序,这是使用该analyze-string
函数的 XSLT 3 示例(如果您仅限于 XSLT 2,请使用相同的方法,但元素而xsl:analyze-string
不是函数内部以提取日期):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mf="http://example.com/mf"
exclude-result-prefixes="#all"
version="3.0">
<xsl:output indent="yes"/>
<xsl:function name="mf:extract-year" as="xs:integer?">
<xsl:param name="input" as="xs:string"/>
<xsl:sequence
select="analyze-string($input, '\(.*?([0-9]{4}).*\)')/*:match/*:group[@nr = 1]/xs:integer(.)"/>
</xsl:function>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="root">
<xsl:copy>
<xsl:for-each-group select="p" group-adjacent="substring-before(named-content[@content-type = 'emEntry'], '(')">
<xsl:apply-templates select="current-group()">
<xsl:sort select="let $year := mf:extract-year(.)
return if ($year) then -$year else 1"/>
</xsl:apply-templates>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- javascript - Openlayers 地图图块最初未在单页应用程序中加载
- javascript - 如何确保始终显示至少一个 DIV?
- javascript - 转换字符串值的Javascript方法
- google-analytics - 如何从服务器使用 Google 跟踪代码管理器设置分析变量?
- swift - 为什么这段 Swift 代码编译和运行没有错误?
- sas - 宏中的 SAS 宏
- matlab - Matlab没有接收到键盘输入
- algorithm - 如何确定此解决方案重复排列的运行时间?
- python - Python3:从 2.7 转换后使用 ttk?
- python - 无需绘图的opencv特征匹配