El objetivo es iterar a través de las filas de la tabla de caracteres y reemplazar cada carácter con su sustituto.
La tabla de caracteres en este ejemplo es ={"&","&";"<","<";">",">";"'","'";"""","""} , o:

*( Nota al margen: "&","&" debe ser el último en la lista en este caso exacto, o reemplazará otras apariciones de sustituciones anteriores, ya que vamos del último al primero).
Fórmula:
=LAMBDA(XML,Pos, LET( Cls,{"&","&";"<","<";">",">";"'","'";"""","""}, Row,IF(ISOMITTED(Pos),ROWS(Cls),Pos), Crf,INDEX(Cls,Row,1), Crr,INDEX(Cls,Row,2), Sub,SUBSTITUTE(XML,Crf,Crr), IF(Row=0,XML,ENCODEXML(Sub,Row-1)) )) El resultado esperado para =ENCODEXML("sl < dk & jf") sería sl < dk & jf
¡ #VALUE! error en su lugar.
=LAMBDA(XML,Pos, LET( Cls,{"&","&";"<","<";">",">";"'","'";"""","""}, Row,IF(ISOMITTED(Pos),ROWS(Cls),Pos), Crf,INDEX(Cls,Row,1), Crr,INDEX(Cls,Row,2), Sub,SUBSTITUTE(XML,Crf,Crr), IF(Row>1,ENCODEXML(Sub,Row-1),Sub) )), en la llamada: =ENCODEXML("sl < dk & jf",) O como descubrió @Filcuk (y aprendí hace un momento) si es opcional, debe declararse usando []
es decir:
=LAMBDA(XML,[Pos], LET( Cls,{"&","&";"<","<";">",">";"'","'";"""","""}, Row,IF(ISOMITTED(Pos),ROWS(Cls),Pos), Crf,INDEX(Cls,Row,1), Crr,INDEX(Cls,Row,2), Sub,SUBSTITUTE(XML,Crf,Crr), IF(Row>1,ENCODEXML(Sub,Row-1),Sub) )) Entonces el , no es necesario:
=ENCODEXML("sl < dk & jf")Solo para complementar la respuesta anterior de Scott; el uso de una lambda recursiva a través del administrador de nombres parece estar obsoleto (si uno no necesita explícitamente una función con nombre para su uso posterior). Dado que REDUCE() es una función recursiva por sí misma. Por lo tanto, se puede aplicar la siguiente estructura:
=LET(X,<LookupTable>,REDUCE(<InputValue>,INDEX(X,0,1),LAMBDA(a,b,SUBSTITUTE(a,b,VLOOKUP(b,X,<ReturnCol>,0)))))Donde:
<LookupTable> : se refiere a una matriz donde la columna más a la izquierda contiene los valores de búsqueda. Esto es particularmente cierto para VLOOKUP() sin embargo, con diferentes estructuras uno puede comenzar a usar XLOOKUP() (para que la solución sea más aplicable);<InputValue> : una referencia a la cadena de entrada a la que necesita aplicar la sustitución;<ReturnCol> - Además del primer punto: cuando se usa VLOOKUP() se debe proporcionar un índice que se refiera a la columna con los valores de reemplazo;En el caso dado por OP, esto se traduciría en:
=LET(X,{"&","&";"<","<";">",">";"'","'";"""","""},REDUCE("sl < dk & jf",INDEX(X,0,1),LAMBDA(a,b,SUBSTITUTE(a,b,VLOOKUP(b,X,2,0)))))