[PATCH 1/5] new transform to create custom HTML guide

Shawn Wells shawn at redhat.com
Thu Oct 10 03:39:59 UTC 2013


On 10/9/13 11:13 PM, Shawn Wells wrote:
> On 10/9/13 10:58 PM, Jeffrey Blank wrote:
>> Signed-off-by: Jeffrey Blank <blank at eclipse.ncsc.mil>
>> ---
>>   RHEL6/transforms/xccdf-removeaux.xslt |    3 +-
>>   RHEL6/transforms/xccdf2html.xslt      |  614 
>> +++++++++++++++++++++++++++++++++
>>   2 files changed, 615 insertions(+), 2 deletions(-)
>>   create mode 100644 RHEL6/transforms/xccdf2html.xslt
>>
>> diff --git a/RHEL6/transforms/xccdf-removeaux.xslt 
>> b/RHEL6/transforms/xccdf-removeaux.xslt
>> index 788969e..62ad820 100644
>> --- a/RHEL6/transforms/xccdf-removeaux.xslt
>> +++ b/RHEL6/transforms/xccdf-removeaux.xslt
>> @@ -8,8 +8,7 @@
>>       <!-- remove the srg_support Group from final output, as it 
>> exists only to
>>          support the OS SRG mapping -->
>> -  <xsl:template match="xccdf:Group[@id='srg_support']">
>> -  </xsl:template>
>> +  <xsl:template match="xccdf:Group[@id='srg_support']" />
>>         <!-- copy everything else through to final output -->
>> diff --git a/RHEL6/transforms/xccdf2html.xslt 
>> b/RHEL6/transforms/xccdf2html.xslt
>> new file mode 100644
>> index 0000000..82d1d16
>> --- /dev/null
>> +++ b/RHEL6/transforms/xccdf2html.xslt
>> @@ -0,0 +1,614 @@
>> +<?xml version="1.0" encoding="UTF-8" ?>
>> +
>> +<!--
>> +  This stylesheet transforms a resolved XCCDF document into a nice
>> +  XHTML document, with table of contents, cross-links, and section
>> +  numbers.  This stylesheet basically assumes that the document is
>> +  compliant with the XCCDF schema, so validation is probably
>> +  advisable.  Note that this stylesheet completely ignores all
>> +  TestResult elements: they do not appear in the generated
>> +  XHTML document.
>> +
>> +  The XCCDF document MUST be resolved before applying this
>> +  stylesheet.  This stylesheet cannot deal with extension/inheritance
>> +  at all.
>> +
>> +  Original version from:
>> +  Author: Neal Ziring (nziring at thecouch.ncsc.mil)
>> +  Version: 0.12.4 (for XCCDF schema version 1.0rc4 - 0.12.4)
>> +  Date: 13 Nov 04
>> + -->
>
> I just peed a little. This is awesome.
>
>> +
>> +<!--
>> + THIS SOFTWARE WAS CREATED BY THE U.S. GOVERNMENT.
>> +
>> + SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
>> + EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
>> + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
>> + IN NO EVENT SHALL THE NATIONAL SECURITY AGENCY OR ANY AGENT OR
>> + REPRESENTATIVE THEREOF BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
>> + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
>> + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
>> + DATA OR PROFITS; OR BUSINESS INTERRUPTION), HOWEVER CAUSED, UNDER ANY
>> + THEORY OF LIABILITY, ARISING IN ANY WAY OUT OF THE USE OF OR INABILITY
>> + TO MAKE USE OF THIS SOFTWARE.
>> +-->
>> +
>> +<xsl:stylesheet version="1.0"
>> +    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>> +    xmlns:htm="http://www.w3.org/1999/xhtml"
>> +    xmlns:xhtml="http://www.w3.org/1999/xhtml"
>> +    xmlns:cdf="http://checklists.nist.gov/xccdf/1.1" >
>> +
>> +<!-- Set output style: XHTML using xml output method. -->
>> +<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
>> +
>> +<!-- Set up an id key to match on against all Items -->
>> +<xsl:key name="items" match="cdf:Group | cdf:Rule | cdf:Value"
>> +         use="@id"/>
>> +
>> +<!-- Set up an id key to match on Item clusters: Rule and Group, 
>> Value -->
>> +<xsl:key name="clusters-rg" match="cdf:Group | cdf:Rule"
>> +         use="@cluster-id"/>
>> +<xsl:key name="clusters-v" match="cdf:Value"
>> +         use="@cluster-id"/>
>> +
>> +<!-- Set up an id key to match on all Profiles -->
>> +<xsl:key name="profiles" match="cdf:Profile" use="@id"/>
>> +
>> +<!-- TEMPLATE for cdf:Benchmark
>> +  -  This template takes care of the top-level structure of the
>> +  -  generated XHTML document.  It handles the Benchmark element
>> +  -  and all the content of the benchmark.
>> +  -->
>> +<xsl:template match="/cdf:Benchmark">
>> +
>> +  <!-- First issue a warning if the Benchmark is not marked 
>> resolved. -->
>> +  <xsl:if test="not(@resolved)">
>> +     <xsl:message>
>> +        Warning: benchmark <xsl:value-of select="@id"/> not 
>> resolved, formatted
>> +        output will be incomplete or corrupted.
>> +     </xsl:message>
>> +  </xsl:if>
>> +
>> +  <!-- Define variables for section numbers. -->
>> +  <xsl:variable name="introSecNum" select="1"/>
>> +  <xsl:variable name="concSecNum"
>> +                select="2 + 
>> number(count(./cdf:Rule[not(number(@hidden)+number(@abstract))] | 
>> ./cdf:Group[not(number(@hidden)+number(@abstract))])!=0) + 
>> number(count(//cdf:Value[not(number(@hidden)+number(@abstract))])!=0) 
>> + number(count(./cdf:Profile)!=0)"/>
>> +  <xsl:variable name="refSecNum"
>> +                select="2 + 
>> number(count(./cdf:Rule[not(number(@hidden)+number(@abstract))] | 
>> ./cdf:Group[not(number(@hidden)+number(@abstract))])!=0) + 
>> number(count(//cdf:Value[not(number(@hidden)+number(@abstract))])!=0) 
>> + number(count(./cdf:Profile)!=0) + 
>> number(count(./cdf:rear-matter)!=0)"/>
>> +
>> +<!-- Begin the HTML/XHTML body -->
>> +<html xmlns="http://www.w3.org/1999/xhtml">
>> +<head>
>> +  <title>XCCDF Benchmark: <xsl:value-of 
>> select="./cdf:title/text()"/></title>
>> +  <meta name="identifier" content="{@id}"/>
>> +  <script type="text/javascript">
>> +    function toggle(divID, imgID) {
>> +        var item = document.getElementById(divID);
>> +        var img = document.getElementById(imgID);
>> +        if (item) {
>> +            item.className = (item.className=='hiddencheck') ? 
>> 'check':'hiddencheck';
>> +        }
>> +        if (img) {
>> +            var currimage = 
>> img.src.substring(img.src.lastIndexOf('/')+1);
>> + 
>> img.src=(currimage=='collapsed.png')?'images/expanded.png':'images/collapsed.png';
>> +            }
>> +    }
>> +  </script>
>> +
>> +  <style type="text/css">
>> +      /*       { background-color: #FFFFFF; } */
>> +      body { margin-left: 8%; margin-right: 8%; foreground: black; }
>> +      h1   { text-align: center; font-size: 200%;  margin-top: 2em; 
>> margin-bottom: 2em;
>> +             font-family: verdana, arial, helvetica, sans-serif;
>> +             border-bottom: solid 2px gray; margin-bottom: 1.0em;
>> +             border-top: solid 2px gray; margin-bottom: 1.0em; }
>> +      h2   { margin-left: -2%; font-size: 125%;
>> +             border-bottom: solid 1px gray; margin-bottom: 1.0em;
>> +             margin-top: 2em; margin-bottom: 0.75em;
>> +             font-family: verdana, arial, helvetica, sans-serif; }
>> +      h3   { margin-left: 6%; font-size: 110%; margin-bottom: 0.25em;
>> +             font-family: verdana, arial, helvetica, sans-serif; }
>> +      h4   { margin-left: 10%; font-size: 100%; margin-bottom: 0.75em;
>> +             font-family: verdana, arial, helvetica, sans-serif; }
>> +      h5,h6 { margin-left: 10%; font-size: 90%; margin-bottom: 0.5em;
>> +              font-family: verdana, arial, helvetica, sans-serif; }
>> +      p    { margin-bottom: 0.2em; margin-top: 0.2em; }
>> +      pre  { margin-bottom: 0.5em; margin-top: 0.25em; margin-left: 3%;
>> +             font-family: monospace; font-size: 90%; }
>> +      ul   { margin-bottom: 0.5em; margin-top: 0.25em; }
>> +      td   { vertical-align: top; }
>> +
>> +      *.simpleText   { margin-left: 10%; }
>> +      *.propertyText { margin-left: 10%; margin-top: 0.2em; 
>> margin-bottom: 0.2em }
>> +      *.toc         { background: #FFFFFF; }
>> +      *.toc2         { background: #FFFFFF; }
>> +      div         { margin-top: 1em; margin-bottom: 1em; }
>> +      div.rule         { margin-left: 10%; border: 1px solid; 
>> padding: 10px 10px 10px 10px; margin-top: 1em; margin-bottom: 1em; }
>> +      div.hiddencheck         { margin-left: 10%; border: 1px solid; 
>> padding: 10px 10px 10px 10px; margin-top: 1em; margin-bottom: 1em; 
>> display: none; }
>> +      div.check         { margin-left: 10%; border: 1px solid; 
>> padding: 10px 10px 10px 10px; margin-top: 1em; margin-bottom: 1em; 
>> display: block; }
>> +      div.legal      { margin-left: 10%; }
>> +
>> +      div.toc         { margin-left: 6%; margin-bottom: 4em;
>> +                       padding-bottom: 0.75em; padding-top: 1em;
>> +                       padding-left: 2em; padding-right: 2em;
>> +                     }
>> +      h2.toc         { border-bottom: none; margin-left: 0%; 
>> margin-top: 0em; }
>> +      p.toc          { margin-left: 2em; margin-bottom: 0.2em; 
>> margin-top: 0.5em; }
>> +      p.toc2         { margin-left: 5em; margin-bottom: 0.1em; 
>> margin-top: 0.1em; }
>> +      ul.smallList   { margin-bottom: 0.1em; margin-top: 0.1em; 
>> font-size: 85%; }
>> +      /* table.propertyTable { margin-left: 14%; width: 90%; 
>> margin-top: 0.5em; margin-bottom: 0.25em; }
>> +      th.propertyTableHead { font-size: 80%; background-color: 
>> #CCCCCC; } */
>> +      table          { border-collapse:collapse; /*border: 1px solid 
>> black;*/ }
>> +      table,th,td   { text-align: left; padding: 8px 8px; }
>> +      table tr:nth-child(2n+2) { background-color: #F4F4F4; }
>> +      th            { border-bottom: 3px solid gray; }
>> +      .expandstyle a         { color: black; text-decoration: none; }
>> +      .expandstyle a:link    { color: black; text-decoration: none; }
>> +      .expandstyle a:visited { color: black; text-decoration: none; }
>> +      .expandstyle a:hover   { color: black; text-decoration: none; }
>> +      .expandstyle a:active  { color: black; text-decoration: none; }
>> +  </style>
>> +</head>
>> +<body>
>> +  <xsl:comment>Benchmark id = <xsl:value-of 
>> select="./@id"/></xsl:comment>
>> +  <xsl:comment>
>> +     This XHTML output file
>> +     generated using the
>> +     <xsl:value-of select="system-property('xsl:vendor')"/>
>> +     XSLT processor.
>> +  </xsl:comment>
>> +
>> +  <!-- BEGINNING OF BODY -->
>> +  <h1><xsl:value-of select="./cdf:title"/></h1>
>> +
>> +  <xsl:if test="./cdf:status | ./cdf:version | ./cdf:platform">
>> +    <div class="simpleText">
>> +      <p>Status: <b><xsl:value-of select="./cdf:status/text()"/></b>
>> +      <xsl:if test="./cdf:status/@date">
>> +         (as of <xsl:value-of select="./cdf:status/@date"/>)
>> +      </xsl:if>
>> +      </p>
>> +      <xsl:if test="./cdf:version">
>> +    <p>Version: <xsl:value-of select="./cdf:version/text()"/></p>
>> +      </xsl:if>
>> +      <xsl:if test="./cdf:platform">
>> +    <p>Applies to:<ul>
>> +      <xsl:apply-templates select="./cdf:platform" mode="list"/>
>> +    </ul></p>
>> +      </xsl:if>
>> +    </div>
>> +  </xsl:if>
>> +
>> +  <!-- 1. Build the introduction -->
>> +  <!--<h2><a name="section-intro"></a>front-matter</h2> -->
>> +  <xsl:if test="./cdf:front-matter">
>> +     <xsl:for-each select="./cdf:front-matter">
>> +       <div class="propertyText">
>> +          <xsl:apply-templates select="./text() | ./*" mode="text"/>
>> +       </div>
>> +     </xsl:for-each>
>> +  </xsl:if>
>> +  <xsl:if test="./cdf:description">
>> +     <h3>Description</h3>
>> +     <xsl:for-each select="./cdf:description">
>> +       <div class="propertyText">
>> +          <xsl:apply-templates select="./text() | ./*" mode="text"/>
>> +       </div>
>> +     </xsl:for-each>
>> +  </xsl:if>
>> +  <xsl:if test="./cdf:notice">
>> +      <xsl:for-each select="./cdf:notice">
>> +        <h3>Notice</h3>
>> +          <div class="legal"><p><xsl:value-of 
>> select="text()"/></p></div>
>> +      </xsl:for-each>
>> +  </xsl:if>
>> +
>> +  <!-- Build the Table of Contents -->
>> +  <br/>
>> +  <h3 class="toc">Contents</h3>
>> +  <div class="toc">
>> +     <!-- rules and groups TOC -->
>> +     <xsl:if 
>> test="./cdf:Group[not(number(@hidden)+number(@abstract))] | 
>> ./cdf:Rule[not(number(@hidden)+number(@abstract))]">
>> +    <xsl:apply-templates mode="toc"
>> + select="./cdf:Group[not(number(@hidden)+number(@abstract))] | 
>> ./cdf:Rule[not(number(@hidden)+number(@abstract))]">
>> +      <xsl:with-param name="section-prefix" />
>> +    </xsl:apply-templates>
>> +     </xsl:if>
>> +
>> +     <!-- rear-matter TOC -->
>> +     <xsl:if test="./cdf:rear-matter">
>> +       <p class="toc">
>> +         <xsl:value-of select="$concSecNum"/>.
>> +         <a class="toc" href="#section---conc">Conclusions</a>
>> +       </p>
>> +     </xsl:if>
>> +
>> +     <!-- references TOC -->
>> +     <xsl:if test="./cdf:reference">
>> +       <p class="toc">
>> +         <xsl:value-of select="$refSecNum"/>. <a class="toc" 
>> href="#section---references">References</a>
>> +       </p>
>> +     </xsl:if>
>> +  </div>
>> +
>> +  <!-- Begin the main page content in the HTML body -->
>> +
>> +
>> +  <!-- Build the rules section (rules and groups) -->
>> +  <xsl:if test="./cdf:Group[not(number(@hidden)+number(@abstract))] 
>> | ./cdf:Rule[not(number(@hidden)+number(@abstract))]">
>> +     <xsl:apply-templates 
>> select="./cdf:Group[not(number(@hidden)+number(@abstract))] | 
>> ./cdf:Rule[not(number(@hidden)+number(@abstract))]" mode="body">
>> +      <xsl:with-param name="section-prefix" />
>> +     </xsl:apply-templates>
>> +  </xsl:if>
>> +
>> +
>> +  <!-- Build the conclusions section using Benchmark/rear-matter -->
>> +  <xsl:if test="./cdf:rear-matter">
>> +     <h2><a name="section---conc"></a>
>> +         <xsl:value-of select="$concSecNum"/>. Conclusions
>> +     </h2>
>> +     <xsl:for-each select="./cdf:rear-matter">
>> +       <div class="propertyText">
>> +          <xsl:apply-templates select="./text() | ./*" mode="text"/>
>> +       </div>
>> +     </xsl:for-each>
>> +  </xsl:if>
>> +
>> +  <!-- Build the references section using Benchmark/reference -->
>> +  <xsl:if test="./cdf:reference">
>> +     <h2><a name="section---references"></a>
>> +        <xsl:value-of select="$refSecNum"/>. References
>> +     </h2>
>> +     <ol xmlns="http://www.w3.org/1999/xhtml" class="propertyText">
>> +    <xsl:for-each select="./cdf:reference">
>> +      <li><xsl:value-of select="text()"/>
>> +        <xsl:if test="@href">
>> +          [<a href="{@href}">link</a>]
>> +            </xsl:if>
>> +      </li>
>> +    </xsl:for-each>
>> +     </ol>
>> +  </xsl:if>
>> +
>> +  <!-- All done, close out the HTML -->
>> +  </body>
>> +</html>
>> +
>> +</xsl:template>
>> +
>> +
>> +<!-- Additional templates for a Value element;
>> +  -  For TOC, we present a line with number, for body
>> +  -  we present a numbered section with title, and then
>> +  -  the fields of the Value with a dl list.
>> +  -->
>> +<xsl:template match="cdf:Value" mode="toc">
>> +  <xsl:param name="section-prefix"/>
>> +  <xsl:param name="section-num" select="position()"/>
>> +
>> +  <!-- <xsl:message>In toc template for Value, id=<xsl:value-of 
>> select="@id"/>.</xsl:message> -->
>> +  <p xmlns="http://www.w3.org/1999/xhtml" class="toc2">
>> +     <xsl:value-of select="$section-prefix"/>
>> +     <xsl:value-of select="$section-num"/>
>> +     <xsl:text>. </xsl:text>
>> +     <a class="toc" href="#{@id}"><xsl:value-of 
>> select="./cdf:title/text()"/></a>
>> +  </p>
>> +</xsl:template>
>> +
>> +<!-- Significant code for displaying Value text is in
>> +     the original version of this file, at
>> +     http://nvd.nist.gov/scap/xccdf/docs/xccdf2xhtml-1.0.xsl -->
>> +
>> +<!-- Template for toc entries for both rules and groups -->
>> +<xsl:template match="cdf:Group | cdf:Rule" mode="toc">
>> +  <xsl:param name="section-prefix"/>
>> +  <xsl:param name="section-num" select="position()"/>
>> +
>> +  <!-- <xsl:message>In toc template for Group|Rule, id=<xsl:value-of 
>> select="@id"/>.</xsl:message> -->
>> +  <p xmlns="http://www.w3.org/1999/xhtml" class="toc2">
>> +     <xsl:value-of select="$section-prefix"/>
>> +     <xsl:value-of select="$section-num"/>
>> +     <xsl:text>. </xsl:text>
>> +     <a class="toc" href="#{@id}"><xsl:value-of 
>> select="./cdf:title/text()"/></a>
>> +  </p>
>> +  <xsl:if test="./cdf:Group | ./cdf:Rule">
>> +    <xsl:apply-templates mode="toc"
>> + select="./cdf:Group[not(number(@hidden)+number(@abstract))] | 
>> ./cdf:Rule[not(number(@hidden)+number(@abstract))]">
>> +        <xsl:with-param name="section-prefix"
>> + select="concat($section-prefix,$section-num,'.')"/>
>> +    </xsl:apply-templates>
>> +  </xsl:if>
>> +</xsl:template>
>> +
>> +
>> +<!-- Template for toc entries for Profiles -->
>> +<xsl:template match="cdf:Profile" mode="toc">
>> +  <xsl:param name="section-prefix"/>
>> +  <xsl:param name="section-num" select="position()"/>
>> +
>> +  <!-- <xsl:message>In toc template for Profile, id=<xsl:value-of 
>> select="@id"/>.</xsl:message> -->
>> +  <p xmlns="http://www.w3.org/1999/xhtml" class="toc2">
>> +     <xsl:value-of select="$section-prefix"/>
>> +     <xsl:value-of select="$section-num"/>
>> +     <xsl:text>. </xsl:text>
>> +     <a class="toc" href="#profile-{@id}"><xsl:value-of 
>> select="./cdf:title/text()"/></a>
>> +  </p>
>> +
>> +</xsl:template>
>> +
>> +<!-- template for body elements for Profiles -->
>> +<xsl:template match="cdf:Profile" mode="body">
>> +  <xsl:param name="section-prefix"/>
>> +  <xsl:param name="section-num" select="position()"/>
>> +
>> +  <!-- <xsl:message>In body template for Profile, id=<xsl:value-of 
>> select="@id"/>.</xsl:message> -->
>> +  <xsl:comment>Profile id = <xsl:value-of 
>> select="./@id"/></xsl:comment>
>> +  <div xmlns="http://www.w3.org/1999/xhtml">
>> +  <h3><a name="profile-{@id}"></a>
>> +     <xsl:value-of select="$section-prefix"/>
>> +     <xsl:value-of select="$section-num"/>
>> +     <xsl:text>. Profile: </xsl:text>
>> +     <i><xsl:value-of select="./cdf:title/text()"/></i>
>> +  </h3>
>> +
>> +  <div class="simpleText">
>> +    <xsl:if test="@extends">
>> +      <p>Extends:
>> +          <xsl:apply-templates select="key('profiles', at extends)" 
>> mode="prof-ref"/>
>> +      </p>
>> +    </xsl:if>
>> +    <xsl:if test="./cdf:status">
>> +      <p>Status: <xsl:value-of select="./cdf:status/text()"/>
>> +        <xsl:if test="./cdf:status/@date">
>> +       (as of <xsl:value-of select="./cdf:status/@date"/>)
>> +    </xsl:if>
>> +      </p>
>> +    </xsl:if>
>> +    <xsl:if test="./cdf:platform">
>> +      <p>Applies only to:<ul>
>> +        <xsl:apply-templates select="./cdf:platform" mode="list"/>
>> +      </ul></p>
>> +    </xsl:if>
>> +  </div>
>> +
>> +  <xsl:if test="./cdf:description">
>> +     <h4>Description</h4>
>> +     <xsl:for-each select="./cdf:description">
>> +       <div class="propertyText">
>> +          <xsl:apply-templates select="./text() | ./*" mode="text"/>
>> +       </div>
>> +     </xsl:for-each>
>> +  </xsl:if>
>> +
>> +  <xsl:if test="./cdf:select">
>> +   <h4>Item Selections</h4>
>> +   <div class="propertyText">
>> +    <p>Rules and Groups explicitly selected and deselected for this 
>> profile.</p>
>> +       <ul>
>> +         <xsl:apply-templates select="." mode="sel-list"/>
>> +       </ul>
>> +   </div>
>> +  </xsl:if>
>> +
>> +  <xsl:if test="./cdf:set-value | ./cdf:refine-value">
>> +   <h4>Value Settings</h4>
>> +   <div class="propertyText">
>> +    <p>Tailoring value adjustments explicitly set for this profile:</p>
>> +       <ul>
>> +         <xsl:apply-templates select="." mode="set-list"/>
>> +       </ul>
>> +   </div>
>> +  </xsl:if>
>> +
>> +  <xsl:if test="./cdf:reference">
>> +    <h4>References:
>> +    <xsl:for-each select="./cdf:reference">
>> +        <xsl:if test="@href">
>> +          <a href="{@href}"><xsl:value-of select="text()"/></a>
>> +        </xsl:if>
>> +    </xsl:for-each>
>> +    </h4>
>> +  </xsl:if>
>> +  </div>
>> +</xsl:template>
>> +
>> +<xsl:template match="cdf:Profile" mode="sel-list">
>> +   <xsl:apply-templates select="./cdf:select" mode="sel-list"/>
>> +</xsl:template>
>> +
>> +<xsl:template match="cdf:Profile" mode="set-list">
>> +   <xsl:apply-templates select="./cdf:set-value" mode="set-list"/>
>> +   <xsl:apply-templates select="./cdf:refine-value" mode="set-list"/>
>> +</xsl:template>
>> +
>> +<xsl:template match="cdf:select" mode="sel-list">
>> +   <li xmlns="http://www.w3.org/1999/xhtml">
>> +       <xsl:if test="number(./@selected)">Included: </xsl:if>
>> +       <xsl:if test="not(number(./@selected))">Excluded: </xsl:if>
>> +       <xsl:if test="count(key('items', at idref))">
>> +            <a href="#{@idref}">
>> +                <xsl:value-of select="key('items', 
>> @idref)/cdf:title/text()"/>
>> +            </a>
>> +       </xsl:if>
>> +       <xsl:if test="not(count(key('items', at idref)))">
>> +            (cluster)
>> +            <xsl:for-each select="key('clusters-rg', at idref)">
>> +              <a href="#{./@id}">
>> +                <xsl:value-of select="./cdf:title/text()"/>
>> +              </a>
>> +            </xsl:for-each>
>> +       </xsl:if>
>> +   </li>
>> +</xsl:template>
>> +
>> +<xsl:template match="cdf:set-value" mode="set-list">
>> +   <li xmlns="http://www.w3.org/1999/xhtml">
>> +     <a href="#{@idref}"><xsl:value-of select="key('items', 
>> @idref)/cdf:title/text()"/></a><br/><xsl:text> set to value: 
>> </xsl:text><b><xsl:value-of select="./text()"/></b>
>> +   </li>
>> +</xsl:template>
>> +
>> +<xsl:template match="cdf:refine-value" mode="set-list">
>> +   <li xmlns="http://www.w3.org/1999/xhtml">
>> +     <a href="#{@idref}"><xsl:value-of select="key('items', 
>> @idref)/cdf:title/text()"/></a><br/><xsl:text> refinement selector: 
>> </xsl:text><b><xsl:value-of select="./@selector"/></b>
>> +   </li>
>> +</xsl:template>
>> +
>> +<xsl:template match="cdf:Profile" mode="prof-ref">
>> +   <a href="#profile-{@id}"><xsl:value-of 
>> select="./cdf:title/text()"/></a>
>> +</xsl:template>
>> +
>> +
>> +<!-- Additional template for a Group element;
>> +  -  we present a numbered section with title, and then
>> +  -  the fields of the Group with a dl list, then the
>> +  -  enclosed items as subsections.
>> +  -->
>> +<xsl:template match="cdf:Group" mode="body">
>> +  <xsl:param name="section-prefix"/>
>> +  <xsl:param name="section-num" select="position()"/>
>> +
>> +  <!--<xsl:message>In body template for Group, id=<xsl:value-of 
>> select="@id"/>.</xsl:message>-->
>> +  <xsl:comment>Group id = <xsl:value-of select="./@id"/></xsl:comment>
>> +  <div  xmlns="http://www.w3.org/1999/xhtml">
>> +  <h2><a name="{@id}"></a>
>> +     <xsl:value-of select="$section-prefix"/>
>> +     <xsl:value-of select="$section-num"/>
>> +     <xsl:value-of select="concat(' ', ./cdf:title/text())"/>
>> +  </h2>
>> +
>> +  <xsl:if test="./cdf:description">
>> +     <xsl:for-each select="./cdf:description">
>> +       <div class="propertyText">
>> +          <xsl:apply-templates select="node()"/>
>> +       </div>
>> +     </xsl:for-each>
>> +  </xsl:if>
>> +
>> +  <xsl:if test="./cdf:rationale">
>> +     <xsl:for-each select="./cdf:rationale">
>> +       <div class="propertyText">
>> +          <xsl:apply-templates select="node()"/>
>> +       </div>
>> +     </xsl:for-each>
>> +  </xsl:if>
>> +
>> +  <xsl:if test="./cdf:warning">
>> +     <h4>Warning</h4>
>> +     <xsl:for-each select="./cdf:warning">
>> +       <div class="propertyText">
>> +          <xsl:apply-templates select="node()"/>
>> +       </div>
>> +     </xsl:for-each>
>> +  </xsl:if>
>> +
>> +
>> +  <xsl:if test="./cdf:reference">
>> +     <h4>References:
>> +       <xsl:for-each select="./cdf:reference">
>> +         <xsl:if test="@href">
>> +          <a href="{@href}"><xsl:value-of select="text()"/> </a>
>> +         </xsl:if>
>> +        </xsl:for-each>
>> +      </h4>
>> +  </xsl:if>
>> +
>> +  <xsl:if test="./cdf:Group | ./cdf:Rule">
>> +      <xsl:apply-templates mode="body" 
>> select="./cdf:Group[not(number(@hidden)+number(@abstract))] | 
>> ./cdf:Rule[not(number(@hidden)+number(@abstract))]">
>> +         <xsl:with-param name="section-prefix"
>> + select="concat($section-prefix,$section-num,'.')"/>
>> +      </xsl:apply-templates>
>> +  </xsl:if>
>> +  </div>
>> +</xsl:template>
>> +
>> +<!-- Additional template for a Rule element in body;
>> +  -  we present a numbered section with title, and then
>> +  -  the fields of the Rule with a dl list.
>> +  -->
>> +<xsl:template match="cdf:Rule" mode="body">
>> +  <xsl:param name="section-prefix"/>
>> +  <xsl:param name="section-num" select="position()"/>
>> +
>> +  <!-- <xsl:message>In body template for Rule, id=<xsl:value-of 
>> select="@id"/>.</xsl:message> -->
>> +  <xsl:comment>Rule id = <xsl:value-of select="./@id"/></xsl:comment>
>> +  <div xmlns="http://www.w3.org/1999/xhtml">
>> +  <h3>
>> +     <a name="{@id}"></a>
>> +     <xsl:value-of select="$section-prefix"/>
>> +     <xsl:value-of select="$section-num"/>
>> +     <i><xsl:value-of select="concat(' ', ./cdf:title/text())"/></i>
>> +  </h3>
>> +
>> +
>> +  <xsl:if test="./cdf:description">
>> +     <!-- <h4>Description</h4> -->
>> +     <xsl:for-each select="./cdf:description">
>> +       <div class="rule">
>> +      <xsl:apply-templates select="node()" />
>> +       </div>
>> +     </xsl:for-each>
>> +  </xsl:if>
>> +
>> +  <xsl:if test="./cdf:rationale">
>> +     <xsl:for-each select="./cdf:rationale">
>> +       <div class="propertyText">
>> +      <xsl:apply-templates select="node()" />
>> +       </div>
>> +     </xsl:for-each>
>> +  </xsl:if>
>> +
>> +  <xsl:if test="./cdf:warning">
>> +     <h4>Warning</h4>
>> +     <xsl:for-each select="./cdf:warning">
>> +       <div class="propertyText">
>> +      <xsl:apply-templates select="node()" />
>> +       </div>
>> +     </xsl:for-each>
>> +  </xsl:if>
>> +
>> +
>> +  <xsl:if test="./cdf:check[@system='ocil-transitional']">
>> +  <xsl:variable name="manualcheck" select="concat('manualcheck-', 
>> @id)"/>
>> +     <xsl:for-each 
>> select="./cdf:check[@system='ocil-transitional']/cdf:check-content">
>> +      <h4 class="expandstyle">
>> +          <a href="javascript:toggle('{$manualcheck}', 
>> 'link-{$manualcheck}');">
>> +          <img id="link-{$manualcheck}" src="images/collapsed.png" 
>> height="20" width="20"/> Check Procedure
>> +          </a>
>> +      </h4>
>> +       <div id="{$manualcheck}" class="hiddencheck">
>> +      <xsl:apply-templates select="node()" />
>> +       </div>
>> +     </xsl:for-each>
>> +  </xsl:if>
>> +
>> +  <xsl:if test="./cdf:reference">
>> +     <h4>References:
>> +     <xsl:for-each select="./cdf:reference">
>> +         <xsl:if test="@href">
>> +            <a href="{@href}" 
>> style="padding-right:15px"><xsl:value-of select="text()"/></a>
>> +         </xsl:if>
>> +     </xsl:for-each>
>> +     </h4>
>> +  </xsl:if>
>> +  </div>
>> +</xsl:template>
>> +
>> +<!-- templates in mode "text", for processing text with
>> +     markup and substitutions.  -->
>> +
>> +  <!-- getting rid of XHTML namespace -->
>> +    <xsl:template match="xhtml:*">
>> +        <xsl:element name="{local-name()}">
>> +            <xsl:apply-templates select="node()|@*"/>
>> +        </xsl:element>
>> +    </xsl:template>
>> +
>> +  <xsl:template match="@*|node()">
>> +    <xsl:copy>
>> +      <xsl:apply-templates select="@*|node()" />
>> +    </xsl:copy>
>> +  </xsl:template>
>> +
>> +</xsl:stylesheet>
>
> Ack

for those following at home, who don't want to clone source:
http://people.redhat.com/swells/scap-security-guide/RHEL6/output/rhel6-guide-custom.html

very very improved!


More information about the scap-security-guide mailing list