xslt 节点替换然后摄取 javascript
xslt node replace then ingest with javascript
在摄取到 NoSQL (marklogic) 数据库之前,我根据特定路径在内存中替换 XML 节点。
输入:/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>
我把/before:image/before:DE/before:before
值替换成一个参数值
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)
预期输出:
<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>
我尝试参数化我的 xsl,但出现错误:
[javascript] XSLT-BADPATTERN: MarkLogic extension syntax used, EQNames are not supported in XSLT mode
EQname 在 XSLT 2.0 样式表中不受支持。您正试图在 @match
表达式中使用它们。
相反,使用您已经在 XSLT 的 @match
表达式的 XPath 中定义的 before
名称空间前缀:
<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>
您还需要为 $replace
定义 xsl:param
或 xsl:variable
,目前未定义。
为什么!不应该
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)
在摄取到 NoSQL (marklogic) 数据库之前,我根据特定路径在内存中替换 XML 节点。
输入:/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>
我把/before:image/before:DE/before:before
值替换成一个参数值
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)
预期输出:
<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>
我尝试参数化我的 xsl,但出现错误:
[javascript] XSLT-BADPATTERN: MarkLogic extension syntax used, EQNames are not supported in XSLT mode
EQname 在 XSLT 2.0 样式表中不受支持。您正试图在 @match
表达式中使用它们。
相反,使用您已经在 XSLT 的 @match
表达式的 XPath 中定义的 before
名称空间前缀:
<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>
您还需要为 $replace
定义 xsl:param
或 xsl:variable
,目前未定义。
为什么!不应该
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)