2009-09-24 6 views
0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="utf-8" /> 
    <xsl:template match="/"> 
    <html> 
     <body> 
     <span> 
      <div style="background-color:#000066;color:#EEEEEE;padding:7px"> 
      <a name="top" style="padding-left:10px;font-size:28pt">Alerting Variables</a> 
      </div> 
     </span> 
     <div style="display:block;padding-left:50px;padding-bottom:10px" class="hbuttons"> 
      <a href="CoreAlerts.xml">LDMS Alerts</a> 
      <a href="ServerManagerAlerts.xml">LDSM Alerts</a> 
      <a href="why.html">Why?</a> 
      <a href="examples.html">Examples</a> 
      <a href="resources.html">Resources</a> 
     </div> 
     <div style="clear: left;"></div> 
     <!-- This is the Table of Contents--> 
     <div style="padding:5px"> 
      <div style="padding:5px;margin-top:10pt;margin-bottom:10pt;font-weight:bold;font-size:20px">Table of Contents - 
      <a style="position:absolute;margin-left:40px" href="PrintPages/PrintAll.html"> 
      <img border="0" src="images/PrintButton.png" /> 
      </a></div> 
      <div style="font-family:Arial;font-weight:bold;margin-left:30px;font-size:10pt"> 
      <xsl:if test="contains(identifiers/sectionname/alert/@name, 'Agent Watcher')"> 
       <a href="#AgentWatcher">Agent Watcher</a> 
       <a style="position:absolute;margin-left:40px" href="PrintPages/PrintAW.html"> 
       <img border="0" src="images/PrintButton.png" /> 
       </a> 
      </xsl:if> 
      <ol style="margin-top:5"> 
       <xsl:for-each select="identifiers/sectionname/alert"> 
       <xsl:if test="contains(@name, 'Agent Watcher')"> 
        <li style="margin-left:10pt;font-size:8pt"> 
        <a> 
         <xsl:attribute name="href"># 
         <xsl:value-of select="@name" /></xsl:attribute> 
         <xsl:value-of select="@name" /> 
        </a> 
        </li> 
       </xsl:if> 
       </xsl:for-each> 
      </ol> 
      </div> 
      <div style="font-family:Arial;font-weight:bold;margin-left:30px;font-size:10pt"> 
      <a href="#Intel vPro">Intel vPro</a> 
      <a style="position:absolute;margin-left:40px" href="PrintPages/PrintvPro.html"> 
       <img border="0" src="images/PrintButton.png" /> 
      </a> 
      <ol style="margin-top:5"> 
       <xsl:for-each select="identifiers/SectionName/alert"> 
       <xsl:if test="contains(@name, 'Intel vPro')"> 
        <li style="margin-left:10pt;font-size:8pt"> 
        <a> 
         <xsl:attribute name="href"># 
         <xsl:value-of select="@name" /></xsl:attribute> 
         <xsl:value-of select="@name" /> 
        </a> 
        </li> 
       </xsl:if> 
       </xsl:for-each> 
      </ol> 
      </div> 
     </div> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

Ci-dessus est mon exemple de code.XSLT: essayer de faire un contains() avec un XPath complet. Pourquoi cela échoue-t-il?

La première instruction xsl:if échoue toujours et n'affiche jamais le texte Agent Watcher ou le bouton d'impression. Même si la section est remplie dans le XML. Si la section est là, la première instruction xsl:if échoue, mais la seconde, contenue dans le xsl:for-each indique le contenu. Comment puis-je faire fonctionner cela?

Je veux l'avoir englobant de sorte que si le XML a du contenu dans la section, il le mettra en place mais sinon ce ne sera pas un contenu vide avec un en-tête ou vice versa. Attachement d'un échantillon XML à traiter.

<identifiers> 
    <sectionname> 
    <alert name="Agent Watcher Service Startup"></alert> 
    <alert name="Agent Watcher Service Not Started"></alert> 
    <alert name="Agent Watcher Service Uninstalled"></alert> 
    <alert name="Agent Watcher File Deleted"></alert> 
    </sectionname> 
    <sectionname> 
    <alert name="Intel vPro agentless discovery failure"></alert> 
    <alert name="Intel vPro System Defense Remediation Alert"></alert> 
    <alert name="Intel vPro Enhanced System Defense Remediation Alert"></alert> 
    <alert name="Intel vPro Enhanced System Defense Alert"></alert> 
    </sectionname> 
</identifiers> 

Blockquote

+0

Voir ma réponse à jour. – Tomalak

Répondre

1

J'ai quelques autres suggestions, mais vous devez poster le XSLT entier (pertinent) avant que je puisse continuer. Au moins le gabarit englobant est nécessaire.

EDIT: Voici ma proposition de feuille de style:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:tmp="http://tempuri.org" 
    exclude-result-prefixes="tmp" 
> 
    <tmp:config> 
    <tmp:alert label="Agent Watcher" link="PrintPages/PrintAW.html" /> 
    <tmp:alert label="Intel vPro" link="PrintPages/PrintvPro.html" /> 
    </tmp:config> 

    <xsl:variable name="everyAlert" select=" 
    /identifiers/sectionname/alert 
    " /> 

    <xsl:template match="/"> 
    <html> 
     <body> 
     <!-- 8< snip --> 
     <div style="..."> 
      <div style="..."> 
      <xsl:text>Table of Contents - </xsl:text> 
      <a style="..." href="PrintPages/PrintAll.html"> 
       <img border="0" src="images/PrintButton.png" /> 
      </a> 
      </div> 
      <xsl:for-each select="document('')/*/tmp:config/tmp:alert"> 
      <xsl:call-template name="section" /> 
      </xsl:for-each> 
     </div> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template name="section"> 
    <xsl:variable name="this" select="." /> 
    <xsl:variable name="alerts" select=" 
     $everyAlert[contains(@name, $this/@label)] 
    " /> 

    <xsl:if test="$alerts"> 
     <div style="..."> 
     <a href="#{translate($this/@label, ' ', '_')}"> 
      <xsl:value-of select="$this/@label" /> 
     </a> 
     <a style="..." href="{$this/@link}"> 
      <img border="0" src="images/PrintButton.png" /> 
     </a> 
     <ol style="..."> 
      <xsl:for-each select="$alerts"> 
      <li style="..."> 
       <a href="#{@name}"><xsl:value-of select="@name" /></a> 
      </li> 
      </xsl:for-each> 
     </ol> 
     </div> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

Caractéristiques:

  • réutilisation de code efficace grâce à un modèle nommé
  • sections imprimées sont facilement configurables
  • utilise <xsl:text> éléments pour éviter les espaces non désirés dans la sortie tout en conservant la liberté de formater le code XSLT correctement
  • utilisations attribut notation littérale (les accolades {}) au lieu de verbeuses <xsl:attribute> éléments
  • utilise un espace de nom temporaire pour permettre le stockage des données de configuration dans la feuille elle-même
  • utilise une boucle <xsl:for-each> et la fonction document() de récupérer et de travailler avec que les données de configuration
  • le for-each utilise le contexte pour le transport du @label et @link courant donc pas <xsl:param> est nécessaire (les <xsl:template name="section"> fonctionne dans tmp:config/tmp:alert contexte, pas dans sectionname/alert contexte!)
  • utilise une variable globale ($everyAlert) pour stocker tous les noeuds pour une utilisation ultérieure
+0

Merci, j'ai été capable de glaner exactement ce dont j'avais besoin de votre réponse. Je vais être honnête, c'était plus que ce dont j'avais besoin, et en ce moment, plus que je ne pouvais supporter. MAIS ... Vous êtes en révision m'a donné quelques excellentes idées et c'est certainement une bonne structure de code et d'utilisation. J'utiliserai ceci comme référence pendant que je continue à nettoyer et réformer mon xsl. Merci beaucoup. Kothoga –

+0

Heureux de vous aider. Si vous avez encore une question à propos d'une certaine partie du code ci-dessus, n'ayez pas peur de demander dans un autre commentaire. – Tomalak

Questions connexes