@@ -494,6 +494,7 @@ class Operation:
494494 "transform-compile" : Operation ("compile an XSLT stylesheet with 300 templates" , "us" ),
495495 "transform-reuse" : Operation ("apply one compiled 300-template stylesheet ten times" , "us" ),
496496 "transform-sort" : Operation ("XSLT sort node sets" , "ms" ),
497+ "transform-key" : Operation ("build XSLT key indexes" , "us" ),
497498 "transform-dense" : Operation ("XSLT transform an instruction-dense sheet" , "us" ),
498499 "transform-names-compile" : Operation ("compile XSLT declaration indexes" , "us" ),
499500 "transform-names" : Operation ("resolve XSLT declaration names" , "us" ),
@@ -1043,6 +1044,30 @@ def _transform_text_cases() -> tuple[tuple[str, object], ...]:
10431044 return tuple (cases )
10441045
10451046
1047+ def _transform_key_cases () -> tuple [tuple [str , object ], ...]:
1048+ return tuple (
1049+ (
1050+ f"{ label } ({ count :,} nodes)" ,
1051+ (
1052+ (
1053+ '<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">'
1054+ f'<xsl:key name="k" match="i" use="{ use } "/><xsl:output method="text"/>'
1055+ f'<xsl:template match="/"><xsl:value-of select="count(key("k","{ wanted } "))"/>'
1056+ "</xsl:template></xsl:stylesheet>"
1057+ ),
1058+ "<r>" + "" .join (item .format (index = index ) for index in range (count )) + "</r>" ,
1059+ ),
1060+ )
1061+ for label , use , wanted , item , count in (
1062+ ("shared scalar key" , "'same'" , "same" , "<i/>" , 8192 ),
1063+ ("shared attribute key" , "@key" , "same" , '<i key="same"/>' , 8192 ),
1064+ ("repeated node-set keys" , "t" , "same" , "<i><t>same</t><t>other</t><t>same</t></i>" , 2048 ),
1065+ ("unique keys" , "@key" , "k0" , '<i key="k{index}"/>' , 8192 ),
1066+ ("small shared key" , "'same'" , "same" , "<i/>" , 4 ),
1067+ )
1068+ )
1069+
1070+
10461071def _transform_cases () -> tuple [tuple [str , object ], ...]:
10471072 """Return the one XSLT case: a real stylesheet (sort, key, number, format-number) over a 120-row catalog."""
10481073 return (("catalog (120 rows)" , (_XSLT_SHEET , _XSLT_SOURCE )),)
@@ -2401,6 +2426,7 @@ def _encoding_result_cases() -> tuple[tuple[str, bytes], ...]:
24012426 "transform-compile" : _transform_compile_cases ,
24022427 "transform-reuse" : _transform_compile_cases ,
24032428 "transform-sort" : _transform_sort_cases ,
2429+ "transform-key" : _transform_key_cases ,
24042430 "transform-dense" : _transform_dense_cases ,
24052431 "transform-names" : _transform_name_cases ,
24062432 "transform-names-compile" : lambda : (_transform_name_cases ()[0 ],),
0 commit comments