Javascript Custom Action using XLST
Posted: Mon Feb 08, 2021 1:08 am
I am trying to implement an author action that will replace all occurrences of an element attribute name with a new name and retain it's value, e.g. element(attr1="val1") with element(attr2="val1"). I was able to create an XSLT transform and execute it via ro.sync.ecss.extensions.commons.operations.XSLTOperation
<action>
<field name="id">
<String>update.XML</String>
</field>
...
<field name="actionModes">
<actionMode-array>
<actionMode>
<field name="xpathCondition">
<String>//*[@id]</String>
</field>
<field name="argValues">
<serializableOrderedMap>
<entry>
<String>action</String>
<String>Replace</String>
</entry>
<entry>
<String>script</String>
<String><?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="assembly[@id]">
<assembly>
<xsl:attribute name="uid"><xsl:value-of select="@id"/></xsl:attribute><xsl:apply-templates></xsl:apply-templates>
</assembly>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet></String>
</entry>
<entry>
<String>sourceLocation</String>
<String>/xmldoc</String>
</entry>
<entry>
<String>targetLocation</String>
<String>/xmldoc</String>
</entry>
</serializableOrderedMap>
</field>
<field name="operationID">
<String>ro.sync.ecss.extensions.commons.operations.XSLTOperation</String>
</field>
</actionMode>
</actionMode-array>
</field>
<field name="enabledInReadOnlyContext">
<Boolean>false</Boolean>
</field>
</action>
This works fine in the oxygen editor but I wanted to implement in Webauthor using a javascript custom action, so I have more control. I tried
UpdateXMLAction.prototype.actionPerformed = function(callback) {
this.editor.getActionsManager().invokeOperation(
'ro.sync.ecss.extensions.commons.operations.XSLTOperation', {
sourceLocation: '/xmldoc',
targetLocation: '/xmldoc',
script: UpdateXMLAction.xslt,
action: 'Replace'
}, callback);
callback && callback();
};
UpdateXMLAction.xslt = `<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="assembly[@id]">
<assembly>
<xsl:attribute name="uid"><xsl:value-of select="@id"/></xsl:attribute><xsl:apply-templates></xsl:apply-templates>
</assembly>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>`;
I can trigger the action but it does nothing and returns no error. Any help would be appreciated.
<action>
<field name="id">
<String>update.XML</String>
</field>
...
<field name="actionModes">
<actionMode-array>
<actionMode>
<field name="xpathCondition">
<String>//*[@id]</String>
</field>
<field name="argValues">
<serializableOrderedMap>
<entry>
<String>action</String>
<String>Replace</String>
</entry>
<entry>
<String>script</String>
<String><?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="assembly[@id]">
<assembly>
<xsl:attribute name="uid"><xsl:value-of select="@id"/></xsl:attribute><xsl:apply-templates></xsl:apply-templates>
</assembly>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet></String>
</entry>
<entry>
<String>sourceLocation</String>
<String>/xmldoc</String>
</entry>
<entry>
<String>targetLocation</String>
<String>/xmldoc</String>
</entry>
</serializableOrderedMap>
</field>
<field name="operationID">
<String>ro.sync.ecss.extensions.commons.operations.XSLTOperation</String>
</field>
</actionMode>
</actionMode-array>
</field>
<field name="enabledInReadOnlyContext">
<Boolean>false</Boolean>
</field>
</action>
This works fine in the oxygen editor but I wanted to implement in Webauthor using a javascript custom action, so I have more control. I tried
UpdateXMLAction.prototype.actionPerformed = function(callback) {
this.editor.getActionsManager().invokeOperation(
'ro.sync.ecss.extensions.commons.operations.XSLTOperation', {
sourceLocation: '/xmldoc',
targetLocation: '/xmldoc',
script: UpdateXMLAction.xslt,
action: 'Replace'
}, callback);
callback && callback();
};
UpdateXMLAction.xslt = `<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="assembly[@id]">
<assembly>
<xsl:attribute name="uid"><xsl:value-of select="@id"/></xsl:attribute><xsl:apply-templates></xsl:apply-templates>
</assembly>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>`;
I can trigger the action but it does nothing and returns no error. Any help would be appreciated.