[xsl] NMTOKENS problem

Subject: [xsl] NMTOKENS problem
From: "Craig Sampson craig.sampson@xxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 12 Feb 2015 20:11:37 -0000
Hi All,
  I am adding a template to one of my transforms that writes out an XML
navigation file in addition to the HTML files created by the transform.

  The DTD defines the softwareContextID attribute as NMTOKENS so that it can
contain one or more identified places in our software. I am using tokenize to
access each NMTOKEN in the attribute. When I run the program (XSLT2 using
SAXON EE) with the "<context ...>" output line commented out everything
functions and I get two "token: xxx" comments in the output file.
  But when I uncomment the output line the transform fails to compile and I
get an error message.
  I've included three scenarios below. Can anyone tell me what the problem is
and how to fix it?
Thanks,
  Craig

I follow this list using the digest mode, so I won't see any responses till
tomorrow unless you also CC me at:
craig.sampson@xxxxxxx<mailto:craig.sampson@xxxxxxx>

Snippet from XML input file:
<topic eid="p1lt7i0ekfifxnn0z4ph10m29vhl" helpID="about" onlineTOC="yes"
printTOC="yes" type="unassigned" xml:lang="en"
softwareContextID="craigabout000">
...
<subSubTopic eid="n0dpmvrz3i0s7gn18cvfhfdo7jr4"
helpID="subsubtopictest01" softwareContextID="craig005subsubtop
craig006subsubtop">

*******************************************************************

Try with tokenize being used to pick out the NMTOKEN's from the
softwareContextID attribute:
          <xsl:for-each select="subSubTopic">
            <xsl:if test="@softwareContextID">
              <xsl:for-each select="tokenize(@softwareContextID,' ')"> <!--
NMTOKENS -->
                <xsl:comment> token: <xsl:value-of select="."/></xsl:comment>
                <xsl:if test="upper-case(.)!='DEFAULTLANDINGPAGE'">
line 606:         <context contextMappingID="{.}" docset="{$alias}"
file="{$deliverable}.htm#{@eid}"/>
                </xsl:if>
              </xsl:for-each> <!-- NMTOKEN -->
            </xsl:if>
          </xsl:for-each>  <!-- subSubTopic -->

FATAL SYNTAX ERROR::
Required item type of the context item for the attribute axis is node();
supplied value has item type xs:string
file:/C:/java/ide/eclipse/4.4/vert-i4xis15/eclipsedata/i4xis15/Publications.X
mlInformationSystem.XisBuild/Source/
Stylesheets/eRoot.xsl, line 606 column -1


*******************************************************************

Try with variable "scID" declared as string:
          <xsl:for-each select="subSubTopic">
            <xsl:if test="@softwareContextID">
              <xsl:for-each select="tokenize(@softwareContextID,' ')"> <!--
NMTOKENS -->
                <xsl:variable name="scID" as="xs:string" select="."/>  <!--
treat NMTOKEN as string -->
                <xsl:comment> token: <xsl:value-of
select="$scID"/></xsl:comment>
                <xsl:if test="upper-case($scID)!='DEFAULTLANDINGPAGE'">
line 607:         <context contextMappingID="{$scID}" docset="{$alias}"
file="{$deliverable}.htm#{@eid}"/>
                </xsl:if>
              </xsl:for-each> <!-- NMTOKEN -->
            </xsl:if>
          </xsl:for-each>  <!-- subSubTopic -->

FATAL SYNTAX ERROR::
Required item type of the context item for the attribute axis is node();
supplied value has item type xs:string
file:/C:/java/ide/eclipse/4.4/vert-i4xis15/eclipsedata/i4xis15/Publications.X
mlInformationSystem.XisBuild/Source/
Stylesheets/eRoot.xsl, line 607 column -1


*******************************************************************

Try with problem line commented out so the token comment will be written out:
          <xsl:for-each select="subSubTopic">
            <xsl:if test="@softwareContextID">
              <xsl:for-each select="tokenize(@softwareContextID,' ')"> <!--
NMTOKENS -->
                <xsl:comment> token: <xsl:value-of select="."/></xsl:comment>
                <xsl:if test="upper-case(.)!='DEFAULTLANDINGPAGE'">
                  <!-- context contextMappingID="{.}" docset="{$alias}"
file="{$deliverable}.htm#{@eid}"/ -->
                </xsl:if>
              </xsl:for-each> <!-- NMTOKEN -->
            </xsl:if>
          </xsl:for-each>  <!-- subSubTopic -->

Output:
<?xml version="1.0" encoding="UTF-8"?>
<contextMapping xmlns="http://www.w3.org/1999/xhtml";>
   <defaultContext docset="crsTestProject"
file="about.htm#p1s028tywy00run0zf1d2tyrkafa"/>
   <contexts>
      <context contextMappingID="craig001xyz"
               docset="crsTestProject"
               file="n070nvz1z69ek3n1jqzfc09i839y.htm"/>
      <context contextMappingID="craig002abc"
               docset="crsTestProject"
               file="p0ry6p2ed3rnthn1cz83qglec18i.htm"/>
      <context contextMappingID="craigabout000"
               docset="crsTestProject"
               file="about.htm"/>
      <!-- token: craig005subsubtop-->
      <!-- token: craig006subsubtop-->
      <context contextMappingID="craig002abcdef"
               docset="crsTestProject"
               file="p0jaax05zteg9an1j3iey30ni7g5.htm"/>
   </contexts>
</contextMapping>

Current Thread