OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

docbook-apps message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]


Subject: Re: [docbook-apps] Expose profile attributes


Hi Eric,
I know that handling of class for phrase was fixed in 1.77.1, so that leaves para and formalpara, both of which use the template named "paragraph" If you customize that template to output a default class value, then that should cover them all.

Bob Stayton
Sagehill Enterprises
bobs@sagehill.net

On 3/20/2014 4:23 PM, Nordlund, Eric wrote:
Thanks for helping me understand this better, Bob.

I tried your custom template, and para, formalpara, and phrase don¹t pass
their class information to the HTML elements.

Section works, and step works, so I know it is at least working somewhere.

I thought there might be something in my company¹s customization layer
that could be screwing things up, so I just added your custom template to
a stock 1.76.1 stylesheet set and I got the same results.

Eric

On 3/20/14, 9:44 AM, "Bob Stayton" <bobs@sagehill.net> wrote:

Hi Eric,
First I need to clear up one misconception.  An xsl:param element at the
start of a template sets the *default* value of the param, and is used
only if that param is not already set to some value by the calling of
the template.  That template is almost always applied with the class
param set to local-name(.), usually set in the 'common.html.attributes'
template.  That's why this does not work:

<xsl:template match="*[@revision]" mode="class.value">
   <xsl:param name="class" select="concat(local-name(.), ' ',
@revision)"/>

While testing my custom template, I noticed that for para, I was only
getting the revision value, not "para" as the default class.  It turns
out there is a bug/feature in the template named "paragraph" in
html/block.xsl (called by the match="para" template) that sets the class
to empty if the @role is not set.  That empty value is passed as the
param to mode="class.value".  Even though it is empty, it counts as the
param value and overrides the default xsl:param in the template.

I don't know why the default class for <para> is empty.  Maybe someone
thought <p class="para"> was redundant as far as CSS coding goes, but I
don't think so because <p> can be generated by many elements besides
<para>.

Anyway, for your custom template, I would suggest not using the "class"
param, but instead create your own xsl:variable for the local-name and
use that:

<xsl:template match="*[@revision]" mode="class.value">
   <xsl:param name="class"/>

   <xsl:variable name="myclass" select="local-name(.)"/>

   <xsl:value-of select="concat($myclass, ' ', @revision)"/>

</xsl:template>

That should work for para and all other cases. Let me know if there are
still elements that don't work, as there may be other exceptions in the
stylesheet.

Bob Stayton
Sagehill Enterprises
bobs@sagehill.net

On 3/19/2014 5:19 PM, Nordlund, Eric wrote:
      <xsl:template match="*[@revision]" mode="class.value">
          <xsl:value-of select="@revision"/>
      </xsl:template>

Thanks Bob, this seemed to work a little, but I think it only applies
my class to elements that would have already had one in the first place.
Paragraphs, spans, and who knows what else completely ignore it. Also,
it deletes the class attribute that would have been there for the
element.

So, I tried this:


<xsl:template match="*[@revision]" mode="class.value">
          <xsl:param name="class" select="concat(local-name(.), ' ',
@revision)"/>
          <!-- permit customization of class value only -->
          <!-- Use element name by default -->
          <xsl:value-of select="$class"/>
      </xsl:template>

This I would have thought would concatenate the local-name and the
revision, but it doesn¹t seem to do anything. Maybe my xpath statement
isn¹t allowed in the xsl:param statement?

So, I again tried this xpath in the class.attribute template:


      <xsl:template match="*[@revision]" mode="class.attribute">
          <xsl:param name="class" select="local-name(.)"/>
          <!-- permit customization of class attributes -->
          <!-- Use element name by default -->
          <xsl:attribute name="class">
              <xsl:apply-templates select="." mode="class.value">
                  <xsl:with-param name="class" select="concat($class, '
', @revision)"/>
              </xsl:apply-templates>
          </xsl:attribute>
      </xsl:template>

This one keeps my original classes and just adds the @revision value
(how come my xpath statement works now?), but again, it only works on
elements that call the class.attribute mode, which many elements do not.

Furthermore, It seems like many of the templates ignore the class.value
mode and just set the class to local-name(.) anyways
(common.html.attributes does this for a lot of templates).

Any ideas on how to get this to work?

Eric

On 3/19/14, 9:44 AM, "Bob Stayton"
<bobs@sagehill.net<mailto:bobs@sagehill.net>> wrote:

Hi Eric,
Take a look at this doc, which describes how to use mode="class.value"
to generate custom class attribute values:

http://www.sagehill.net/docbookxsl/HtmlCustomEx.html#CustomClassValues

In your case, you would want to add a custom template starting with:

<xsl:template match="*[@revision]" mode="class.value">

and instead of just outputting the $class template param, you could add
the value of @revision.

Bob Stayton
Sagehill Enterprises
bobs@sagehill.net<mailto:bobs@sagehill.net>

On 3/18/2014 4:54 PM, Nordlund, Eric wrote:
Hi, sorry if this is a repeat message, I sent it a few hours ago and I
still haven¹t seen it on the list yet.
‹‹‹‹‹
Hello, I have a user guide that I am adding new features to and I want
to signal the new content with a background color (like a light green or
something like that).

Since all of the content for this feature is profiled with the
³revision² attribute, I thought a smart way to do this would be to send
the revision value through as a class and then add a css rule for the
class, such as:

.feature-x {
background-color: green;
}

I think I should modify this template here:

<xsl:template match="*" mode="common.html.attributes">
<xsl:param name="class" select="local-name(.)"/>
<xsl:param name="inherit" select="0"/>
<xsl:call-template name="generate.html.lang"/>
<xsl:call-template name="dir">
<xsl:with-param name="inherit" select="$inherit"/>
</xsl:call-template>
<xsl:apply-templates select="." mode="class.attribute">
<xsl:with-param name="class" select="$class"/>
</xsl:apply-templates>
<xsl:call-template name="generate.html.title"/>
</xsl:template>


But I can¹t seem to figure out what to put there that works for
profiled and non-profiled content without stripping the actual class
value that should be there.


Am I thinking about this the right way, or is there an even easier wa
to do what I want to accomplish?


Thanks a bunch in advance,


Eric









[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]