I'm having trouble getting the value in the audience tag to appear in my output file while running an XSLT transform on a DITA map.
This is the snippet of my input with audience="Alaska"
:
<topicgroup>
<topichead navtitle="Alaska Property and Casualty Adjuster Law" locktitle="yes" audience="Alaska">
<topicgroup>
<mapref href="Qbank/maps/Adj_Unit_AK.ditamap" format="ditamap"/>
</topicgroup>
</topichead>
</topicgroup>
Here's the portion of my XSLT script that contains the <!--Add audience-->
section:
<xsl:template match="topichead">
<xsl:param name="all_topic_refs" select="topicref[@type='topic' or @type='concept']" as="element()*"/>
<xsl:param name="all_question_refs" select="topicref[@type='question']" as="element()*"/>
<xsl:param name="all_exam_refs" select="topicref[@type='exam']" as="element()*"/>
<xsl:param name="audience" select="topichead[@audience='property' or @type='concept']" as="element()*"/>
<xsl:param name="all_exam_maps" select="descendant-or-self::examMap" as="element()*"/>
<xsl:copy>
<xsl:attribute name="navtitle">
<xsl:choose>
<xsl:when test="navtitle">
<xsl:apply-templates select="navtitle"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@navtitle"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<!--Add audience-->
<xsl:attribute name="audience">
<xsl:value-of select="@audience"/>
</xsl:attribute>
<xsl:apply-templates select="*[not(self::examMap[@assessment_type='test-exam-primary']) and not(self::navtitle)]">
<xsl:with-param name="all_topic_refs" select="$all_topic_refs"/>
<xsl:with-param name="all_question_refs" select="$all_question_refs"/>
<xsl:with-param name="all_exam_refs" select="$all_exam_refs"/>
<xsl:with-param name="all_exam_maps" select="$all_exam_maps"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
The output is giving me this with empty quotes in the Audience tag:
<topichead navtitle="Alaska Property and Casualty Adjuster Law" audience="">
<topicref href="questions/inslic_assess_Adj_AK.dita"/>
</topichead>
It pulls over the navtitle correctly but I can't figure why it won't pull over the audience input. Any help would be most appreciated.
Here's the full input file:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE bookmap PUBLIC "-//OASIS//DTD DITA BookMap//EN" "bookmap.dtd" []>
<bookmap>
<booktitle>
<mainbooktitle>Property & Casualty Insurance Adjuster Qbank</mainbooktitle>
</booktitle>
<bookmeta>
<category>course</category>
<!-- <category> will describe type of map it is (qbank, course w/final exam, final exam, etc) -->
<prodinfo>
<prodname>Insurance Adjuster Licensing</prodname>
<vrmlist>
<vrm version="2022"/>
</vrmlist>
<brand>lic</brand>
<series>adjqbank</series>
</prodinfo>
<bookid>
<bookpartno>00012345</bookpartno>
</bookid>
</bookmeta>
<!--
# Transform Type: LMS_Transform
# DITAVAL: USstate_National_Short_Adjuster_Digital_InsLic.ditaval
# File Path to Final Zip: G:\Shared drives\DITA Zip Files\Insurance Licensing\Property & Casualty\20535_National Insurance Adjuster Solution
# Reltable: N
# Glossary notes: Y/N
# Run from main folder?: N
# PDF: Standard
-->
<chapter href="Qbank/topics/Adj_Qbank_1.dita" locktitle="yes">
<topicmeta>
<navtitle>Property & Casualty Insurance Adjuster</navtitle>
</topicmeta>
<topicgroup>
<topichead navtitle="Introduction to Insurance" locktitle="yes">
<topicgroup>
<mapref href="Qbank/maps/Adj_Unit_1.ditamap" format="ditamap"/>
</topicgroup>
</topichead>
</topicgroup>
<topicgroup>
<topichead navtitle="Contracts" locktitle="yes">
<topicgroup>
<mapref href="Qbank/maps/Adj_Unit_2.ditamap" format="ditamap"/>
</topicgroup>
</topichead>
</topicgroup>
</chapter>
<chapter href="Qbank/topics/Adj_Qbank_State_Specific.dita" locktitle="yes">
<topicmeta>
<navtitle>State Regulations</navtitle>
</topicmeta>
<topicgroup>
<topichead audience="Alabama" navtitle="Alabama Property and Casualty Adjuster Law" locktitle="yes">
<topicgroup>
<mapref href="Qbank/maps/Adj_Unit_AL.ditamap" format="ditamap"/>
</topicgroup>
</topichead>
</topicgroup>
<topicgroup>
<topichead navtitle="Alaska Property and Casualty Adjuster Law" locktitle="yes" audience="Alaska">
<topicgroup>
<mapref href="Qbank/maps/Adj_Unit_AK.ditamap" format="ditamap"/>
</topicgroup>
</topichead>
</topicgroup>
<topicgroup>
<topichead navtitle="Arizona Property and Casualty Adjuster Law" locktitle="yes" audience="Arizona">
<topicgroup>
<mapref href="Qbank/maps/Adj_Unit_AZ.ditamap" format="ditamap"/>
</topicgroup>
</topichead>
</topicgroup>
</chapter>
</bookmap>
Here's the full script with the non-related stuff removed:
<?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"
xmlns:functx="http://www.functx.com"
xmlns:ditaarch="http://dita.oasis-open.org/architecture/2005/"
exclude-result-prefixes="xs functx ditaarch" version="2.0">
<xsl:import href="functx-1.0.xsl"/>
<xsl:import href="new_topic_task.xsl"/>
<xsl:param name="BASE_DIR"/>
<xsl:param name="OUT_DIR"/>
<xsl:output encoding="UTF-8" method="xml" indent="yes"
doctype-public="-//OASIS//DTD DITA Map//EN" doctype-system="map.dtd"/>
<xsl:strip-space elements="*"/>
<!-- Create a global variable so that we can refer back to the supermap. -->
<xsl:variable name="supermap" select="/supermap" as="element()*"/>
<!-- Create a global variable so that we can refer back to the los. -->
<xsl:variable name="los_summary" select="/supermap/los_summary" as="element()*"/>
<xsl:template match="/">
<xsl:apply-templates select="supermap"/>
</xsl:template>
<xsl:template match="supermap">
<map>
<xsl:attribute name="title">
<xsl:value-of select="@title"/>
</xsl:attribute>
<xsl:attribute name="id">
<xsl:value-of select="@id"/>
</xsl:attribute>
<!-- Handle topicheads. -->
<xsl:apply-templates select="topichead"/>
<!-- Create the final exam map outside all other topic heads. -->
<xsl:apply-templates select="topichead[@unit_map_type='final-exam']/examMap">
</xsl:apply-templates>
<!-- Handle LOS. -->
<xsl:apply-templates select="los_summary"/>
</map>
</xsl:template>
<!-- Top level topichead. -->
<xsl:template match="topichead">
<!-- Made these parameters so that subordinate topicheads behave correctly...I think. -->
<xsl:param name="all_topic_refs" select="topicref[@type='topic' or @type='concept']" as="element()*"/>
<xsl:param name="all_question_refs" select="topicref[@type='question']" as="element()*"/>
<xsl:param name="all_exam_refs" select="topicref[@type='exam']" as="element()*"/>
<xsl:param name="audience" select="topichead[@audience='property' or @type='concept']" as="element()*"/>
<!-- Added for QBank -->
<xsl:param name="all_exam_maps" select="descendant-or-self::examMap" as="element()*"/>
<!-- [SP] 2015-01-13: Don't display topichead in qbank output. -->
<xsl:choose>
<xsl:when test="@unit_map_type = 'qbank'">
<xsl:apply-templates select="*[not(self::examMap[@assessment_type='test-exam-primary'])]">
<xsl:with-param name="all_topic_refs" select="$all_topic_refs"/>
<xsl:with-param name="all_question_refs" select="$all_question_refs"/>
<xsl:with-param name="all_exam_refs" select="$all_exam_refs"/>
<xsl:with-param name="all_exam_maps" select="$all_exam_maps"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:attribute name="navtitle">
<xsl:choose>
<xsl:when test="navtitle">
<xsl:apply-templates select="navtitle"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@navtitle"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<!--Add audience-->
<xsl:attribute name="audience">
<xsl:value-of select="@audience"/>
</xsl:attribute>
<xsl:apply-templates select="*[not(self::examMap[@assessment_type='test-exam-primary']) and not(self::navtitle)]">
<xsl:with-param name="all_topic_refs" select="$all_topic_refs"/>
<xsl:with-param name="all_question_refs" select="$all_question_refs"/>
<xsl:with-param name="all_exam_refs" select="$all_exam_refs"/>
<xsl:with-param name="all_exam_maps" select="$all_exam_maps"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="@*">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>
I will assume your XSLT stylesheet is applied at a certain stage from a plugin when publishing the DITA XML content using the DITA Open Toolkit. You can add an xsl:message inside the xsl:template which matches the topichead:
<xsl:message><xsl:copy-of select="."/></xsl:message>
Then look in the console output when publishing to see exactly on what XML element the template is applied. The DITA Open Toolkit publishing engine has a pre-processing step which applies filtering and removes all profiling attributes from all elements. https://www.dita-ot.org/dev/reference/preprocess-debugfilter.html
To preserve the profiling attributes when publishing you need to specify a DITAVAL filter file which specifies that the profiling attributes should pass through to the published output. Something like:
<val>
<prop action="passthrough" att="audience"/>
</val>
https://www.oxygenxml.com/dita/1.3/specs/langRef/ditaval/ditaval-prop.html