One important lesson learned.. I first used timestamps for the merged files. It seemed like Saxon was able to merge 4 use cases in 1 millisecond so they ended up overwriting each other. So I quickly had to look for another alternative and switched to using the hashcode of the grouping-keys.
Example map:
<?xml version="1.0" encoding="utf-8"?>
<value-proposition id="vp_BC51-10PA" rev="001.001" title="Value proposition" xml:lang="en-US">
<topicmeta translate="no">
<subtitle translate="yes">45 V, 1 A PNP medium power transistor</subtitle>
<prodinfo><prodname>BC51-10PA</prodname></prodinfo>
</topicmeta>
<technical-summary-ref href="technical-summary/ts_BC51-10PA.dita"/>
<features-benefits-ref href="features-benefits/fb_BC51-10PA.dita"/>
<target-applications-ref href="target-applications/ta_BC51-10PA.dita"/>
</value-proposition>
Example topic
<?xml version="1.0" encoding="utf-8"?>
<p-topic id="fb_BC51-10PA" rev="001.001" xml:lang="en-US">
<title translate="no">Features and benefits</title>
<prolog translate="no">...</prolog>
<body>
<ul>
<li><p>High current</p></li>
<li><p>Three current gain selections</p></li>
<li><p>High power dissipation capability</p></li>
<li><p>Exposed heatsink for excellent thermal and electrical conductivity</p></li>
<li><p>Leadless very small SMD plastic package with medium power capability</p></li>
<li><p>AEC-Q101 qualified</p></li>
</ul>
</body>
</p-topic>
I just am going to share the XSLT's that did the hard work to merge the topics and maps. I'm sure I can reuse the same approach in the future.
topicmerge.xslt
<?xml version="1.0" encoding="UTF-8"?>
<!--
Author: Robby Pelssers
This stylesheet will merge topics if they have the same body tag
-->
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:nxp="http://www.nxp.com">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="exportFolder"/>
<xsl:param name="subFolder"/>
<xsl:variable name="folderTemplate" select="concat('file:///', $exportFolder, $subFolder, '/topic-type/?select=*.dita')"/>
<xsl:variable name="featuresandbenefits" select="collection(replace($folderTemplate, 'topic-type', 'features-benefits'))"/>
<xsl:variable name="technicalsummaries" select="collection(replace($folderTemplate, 'topic-type', 'technical-summary'))"/>
<xsl:variable name="targetapplications" select="collection(replace($folderTemplate, 'topic-type', 'target-applications'))"/>
<xsl:variable name="date-format" select="'[Y0001]-[M01]-[D01]T[h01]:[m01]:[s01]'"/>
<xsl:function name="nxp:getHashCode">
<xsl:param name="stringvalue" as="xs:string"/>
<xsl:value-of select="string:hashCode($stringvalue)" xmlns:string="java:java.lang.String"/>
</xsl:function>
<!-- handles a logical group of documents (featuresandbenefits | technicalsummaries | targetapplications) -->
<xsl:template name="mergeDocumentGroup">
<xsl:param name="documents"/>
<xsl:for-each-group select="$documents" group-by="p-topic/body">
<xsl:call-template name="p-topic">
<xsl:with-param name="topics" select="current-group()/p-topic"/>
<xsl:with-param name="grouping_key" select="current-grouping-key()"/>
</xsl:call-template>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="/">
<result>
<xsl:call-template name="mergeDocumentGroup">
<xsl:with-param name="documents" select="$featuresandbenefits"/>
</xsl:call-template>
<xsl:call-template name="mergeDocumentGroup">
<xsl:with-param name="documents" select="$technicalsummaries"/>
</xsl:call-template>
<xsl:call-template name="mergeDocumentGroup">
<xsl:with-param name="documents" select="$targetapplications"/>
</xsl:call-template>
</result>
</xsl:template>
<xsl:template name="p-topic">
<xsl:param name="topics"/>
<xsl:param name="grouping_key"/>
<xsl:variable name="topic" select="$topics[1]"/>
<p-topic>
<xsl:choose>
<xsl:when test="count($topics) > 1">
<xsl:apply-templates select="$topic/@* | $topic/node()" mode="merge">
<xsl:with-param name="grouping_key" select="$grouping_key" tunnel="yes"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="$topic/@* | $topic/node()"/>
</xsl:otherwise>
</xsl:choose>
<!-- we temporarily add the original topic id's so we can easily alter the topicrefs in a subsequent transform -->
<topics>
<xsl:for-each select="$topics">
<id><xsl:value-of select="./@id"/></id>
</xsl:for-each>
</topics>
</p-topic>
</xsl:template>
<xsl:template match="p-topic/@id" mode="merge">
<xsl:param name="grouping_key" tunnel="yes"/>
<xsl:attribute name="id"
select="concat(substring-before(., '_'), '_', translate(nxp:getHashCode($grouping_key), '-', ''))"/>
</xsl:template>
<!-- copy all nodes and attributes which are not processed by one of available templates -->
<xsl:template match="@* | node()">
<xsl:copy copy-namespaces="no">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="@* | node()" mode="merge">
<xsl:copy copy-namespaces="no">
<xsl:apply-templates select="@*" mode="merge"/>
<xsl:apply-templates mode="merge"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
mapmerge.xslt
<?xml version="1.0" encoding="UTF-8"?>
<!--
Author: Robby Pelssers
This stylesheet will merge maps which have same topic refs and same title.
-->
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:nxp="http://www.nxp.com">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:variable name="date-format" select="'[Y0001]-[M01]-[D01]T[h01]:[m01]:[s01]'"/>
<xsl:function name="nxp:getHashCode">
<xsl:param name="stringvalue" as="xs:string"/>
<xsl:value-of select="string:hashCode($stringvalue)" xmlns:string="java:java.lang.String"/>
</xsl:function>
<xsl:function name="nxp:getMapGroupingKey" as="xs:string">
<xsl:param name="vp" as="element(value-proposition)"/>
<xsl:sequence select="concat($vp/topicmeta/subtitle, $vp/technical-summary-ref/@href,
$vp/features-benefits-ref/@href, $vp/target-applications-ref/@href)"/>
</xsl:function>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="result">
<result>
<xsl:apply-templates select="p-topic"/>
<xsl:for-each-group select="value-proposition" group-by="nxp:getMapGroupingKey(.)">
<xsl:call-template name="value-proposition">
<xsl:with-param name="valuepropositions" select="current-group()"/>
<xsl:with-param name="grouping_key" select="current-grouping-key()"/>
</xsl:call-template>
</xsl:for-each-group>
</result>
</xsl:template>
<xsl:template name="value-proposition">
<xsl:param name="valuepropositions"/>
<xsl:param name="grouping_key"/>
<xsl:variable name="vp" select="$valuepropositions[1]"/>
<value-proposition>
<xsl:choose>
<xsl:when test="count($valuepropositions) > 1">
<xsl:apply-templates select="$vp/@* | $vp/node()" mode="merge">
<xsl:with-param name="valuepropositions" select="$valuepropositions" tunnel="yes"/>
<xsl:with-param name="grouping_key" select="$grouping_key" tunnel="yes"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="$vp/@* | $vp/node()"/>
</xsl:otherwise>
</xsl:choose>
</value-proposition>
</xsl:template>
<xsl:template match="value-proposition/@id" mode="merge">
<xsl:param name="grouping_key" tunnel="yes"/>
<xsl:attribute name="id"
select="concat(substring-before(., '_'), '_', translate(nxp:getHashCode($grouping_key), '-', ''))"/>
</xsl:template>
<!-- copy all nodes and attributes which are not processed by one of available templates -->
<xsl:template match="@* | node()">
<xsl:copy copy-namespaces="no">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="@* | node()" mode="merge">
<xsl:copy copy-namespaces="no">
<xsl:apply-templates select="@*" mode="merge"/>
<xsl:apply-templates mode="merge"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
No comments:
Post a Comment