XSLT no son etiquetas recurrentes ni selección de la primera etiqueta

Tengo dos problemas al tratar de procesar XML que tiene etiquetas recursivas (la misma etiqueta que se repite dentro de la etiqueta).

Problema n. ° 1, la parte "Título:" genera la concatenación de texto de todas las etiquetas de título, es como si estuviera buscando desde / y no desde la ruta por la que fue invocado.

Problema n.º 2 @id test no encuentra nada, lo que probablemente sea un síntoma del mismo problema.

Aquí está el XSL:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cog="http://developer.cognos.com/schemas/xmldata/1/" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"> 
<xsl:template match="/">
<xsl:template match="cog:rows">
    <xsl:apply-templates select="cog:rowEdge"/>
</xsl:template>
<xsl:template match="cog:rowEdge">
    <p><b>Caption:</b> <xsl:value-of select="cog:caption"/></p>
    <xsl:if test="@id">
        <b>id:</b> <xsl:value-of select="@id"/><br/>
    </xsl:if>
    <xsl:if test="cog:rowEdge">
        <p>Looking at next rowEdge</p>
        <xsl:apply-templates select="cog:rowEdge"/>
    </xsl:if>
</xsl:template>
<html>
<head><title>%s</title></head>
<body>
    <xsl:apply-templates select="cog:dataset/cog:crosstab/cog:rows"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet> 

Aquí está el XML:

<?xml version="1.0" encoding="utf-8" ?>  
 <dataset xmlns="http://developer.cognos.com/schemas/xmldata/1/" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"> 
 <crosstab> 
 <values> 
  <value row="R1" col="C1" xs:nil="true" />  
  <value row="R1" col="C2" xs:nil="true" />  
  <value row="R1" col="C3" xs:nil="true" />  
  <value row="R1" col="C4" xs:nil="true" />  
  <value row="R1" col="C5" xs:nil="true" />  
  <value row="R1" col="C6" xs:nil="true" />  
  <value row="R1" col="C7" xs:nil="true" />  
  <value row="R1" col="C8" xs:nil="true" />  
  <value row="R1" col="C9" xs:nil="true" />  
  <value row="R2" col="C1">0</value>  
  <value row="R2" col="C2">12.61728395</value>  
  <value row="R2" col="C3">1320.40677966</value>  
  <value row="R2" col="C4">7</value>  
  <value row="R2" col="C5">1.90318499</value>  
  <value row="R2" col="C6">108.66456135</value>  
  <value row="R2" col="C7">776.61407946</value>  
  <value row="R2" col="C8">-0.86007907</value>  
  <value row="R2" col="C9">46.53571429</value>  
</values> 
 <corner> 
  <caption>Time Period: DCG Incurred Paid Year</caption>  
  </corner> 
 <columns> 
 <colEdge> 
  <caption>Jan 02 to Dec 02 {All Data} CRxIp</caption>  
 <colEdge> 
  <caption>2002</caption>  
 <colEdge id="C1"> 
  <caption>Member Age Avg</caption>  
  </colEdge> 
 <colEdge id="C2"> 
  <caption>Days Supply Per Script Rx</caption>  
  </colEdge> 
 <colEdge id="C3"> 
  <caption>Net Pay Per Pat Med</caption>  
  </colEdge> 
 <colEdge id="C4"> 
  <caption>Days LOS Admit Acute</caption>  
  </colEdge> 
 <colEdge id="C5"> 
  <caption>Days LOS Admit Acute</caption>  
  </colEdge> 
 <colEdge id="C6"> 
  <caption>Allow Amt PMPM Med and Rx {Cmpl}</caption>  
  </colEdge> 
 <colEdge id="C7"> 
  <caption>Allow Amt PMPM Med and Rx {Cmpl}</caption>  
  </colEdge> 
 <colEdge id="C8"> 
  <caption>% Diff Allow Amt PMPM Med and Rx {Cmpl}</caption>  
  </colEdge> 
 <colEdge id="C9"> 
  <caption>Relative Risk Score Prosp Explan NonRescaled</caption>  
  </colEdge> 
  </colEdge> 
  </colEdge> 
  </columns> 
 <rows> 
 <rowEdge> 
  <caption>Subsets</caption>  
 <rowEdge> 
  <caption>Plan Type Medstat</caption>  
 <rowEdge id="R1"> 
  <caption>Cohort Medstat</caption>  
  </rowEdge> 
  </rowEdge> 
  </rowEdge> 
 <rowEdge> 
  <caption>Chronic Episodes</caption>  
 <rowEdge> 
  <caption>HMO (Managed Care)</caption>  
 <rowEdge id="R2"> 
  <caption>Females, Ages &lt; 1</caption>  
  </rowEdge> 
</rowEdge> 
 </rowEdge> 
 </rows> 
  </crosstab> 
  </dataset> 

preguntado el 22 de mayo de 12 a las 19:05

¿Sería posible publicar su resultado esperado en este caso? Además, su muestra XSLT no es válida porque tiene y <xsl:template> anidado dentro de otro <xsl:template> que no está permitido. -

1 Respuestas

Su hoja de estilo no es válida porque la plantilla para el nodo del documento envuelve a todos los demás. Las plantillas son elementos de nivel superior en XSLT y no se deben anidar. Si los separa, la hoja de estilo debería funcionar como se esperaba:

<xsl:stylesheet version="1.0" 
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
   xmlns:cog="http://developer.cognos.com/schemas/xmldata/1/" 
   xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"> 

   <xsl:template match="/">
      <html>
         <head><title>%s</title></head>
         <body>
            <xsl:apply-templates select="cog:dataset/cog:crosstab/cog:rows"/>
         </body>
      </html>
   </xsl:template>

   <xsl:template match="cog:rows">
      <xsl:apply-templates/>
   </xsl:template>

   <xsl:template match="cog:rowEdge">
      <p><b>Caption:</b> <xsl:value-of select="cog:caption"/></p>
      <xsl:if test="@id">
         <b>id:</b> <xsl:value-of select="@id"/><br/>
      </xsl:if>
      <xsl:if test="cog:rowEdge">
         <p>Looking at next rowEdge</p>
         <xsl:apply-templates select="cog:rowEdge"/>
      </xsl:if>
   </xsl:template>
</xsl:stylesheet> 

contestado el 22 de mayo de 12 a las 19:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.