Reemplazo en el nodo XML de la memoria según la ruta específica antes de la ingesta en la base de datos NoSQL (marklogic).
Entrada: /doc1.xml
<image xmlns="http://coin/decimal"> <DE> <denomination>1pf</denomination> <reverse>rye stalks</reverse> <obverse>oak sprig</obverse> <before>Anglo–Saxons</before> </DE> <GBP> <denomination>1p</denomination> <reverse>Arms</reverse> <obverse>Queen</obverse> <before>Anglo–Saxons</before> </GBP> </image> Reemplazo el valor /before:image/before:DE/before:before por un valor de parámetro Xsl:
const beforeXsl = fn.head(xdmp.unquote( ` <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:before="http://coin/decimal" version="2.0"> <xsl:template match="/Q{http://coin/decimal}image/Q{http://coin/decimal}DE/Q{http://coin/decimal}before"> <xsl:element name="{local-name()}"> <xsl:value-of select="$replace"/> </xsl:element> </xsl:template> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> </xsl:transform> `)); xdmp.xsltEval(beforeXsl, doc, params)Rendimiento esperado:
<image xmlns="http://coin/decimal"> <DE> <denomination>1pf</denomination> <reverse>rye stalks</reverse> <obverse>oak sprig</obverse> <before>Anglo-Dutch</before> </DE> <GBP> <denomination>1p</denomination> <reverse>Arms</reverse> <obverse>Queen</obverse> <before>Anglo–Saxons</before> </GBP> </image>Trato de parametrizar mi xsl, pero tengo el error:
[javascript] XSLT-BADPATTERN: MarkLogic extension syntax used, EQNames are not supported in XSLT mode¡Por qué! ¿No debería haber sido
var params = {}; params.nsProduct = "http://coin/decimal" params.qPath = "/before:image/before:DE/before:before" params.replaceValue="Anglo-Dutch" const implReplace = fn.head(xdmp.unquote( ` <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:before="http://coin/decimal" exclude-result-prefixes="#all" version="2.0"> <xsl:param name="nsProduct"/> <xsl:param name="qPath"/> <xsl:param name="replaceValue" as="xs:anyAtomicType"/> <xsl:template match="node()[(xdmp:path(.) eq $qPath)]"> <xsl:variable name="replace"> <xsl:element name="{local-name()}" namespace="{$nsProduct}"> <xsl:value-of select="$replaceValue"/> </xsl:element> </xsl:variable> <xsl:sequence select="$replace"/> </xsl:template> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> </xsl:transform> `)); xdmp.xsltEval(implReplace, doc, params)EQname no se admite en las hojas de estilo XSLT 2.0. Está intentando usarlos en la expresión @match .
En su lugar, use el prefijo de espacio de nombres before que ya ha definido en XPath en su expresión @match en su XSLT:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:before="http://coin/decimal" version="2.0"> <xsl:param name="replace"/> <xsl:template match="/before:image/before:DE/before:before"> <xsl:element name="{local-name()}"> <xsl:value-of select="$replace"/> </xsl:element> </xsl:template> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> </xsl:transform> También deberá definir un xsl:param o xsl:variable para $replace , que actualmente no está definido.