xsl-list
[Top] [All Lists]

Re: Grouping with keys

2006-02-09 10:14:09
To Mike Ferrando,

yes it works! great!
It looks like very difficult so i need time to understand it ;-), 
but thank you very much for this solution!

regards
Silvia


Von: Mike Ferrando <mikeferrando(_at_)yahoo(_dot_)com>


Silvia L.,
I was messing around with this and came up with a solution.

I probably write things different than you do. Others on this list
would greatly simplify these templates. However, I wanted you to see
how it works. I use for-each only in special circumstances.

Hope you like it.

Mike Ferrando
Library Technician
Library of Congress
Washington, DC
202-707-4454

===XML:===
<?xml version="1.0" encoding="UTF-8"?>
<!-- <?mso-application progid="Word.Document"?> -->
<wordDocument>
  <body>
    <sect>
      <p>
        <pPr>
          <pStyle val="Heading1"/>
        </pPr>
        <r>
          <t>Erste Ueberschrift</t>
        </r>
      </p>
      <p>
        <pPr>
          <pStyle val="Programlisting"/>
        </pPr>
        <r>
          <t>&lt;HTML&gt;</t>
        </r>
      </p>
      <p>
        <pPr>
          <pStyle val="Programlisting"/>
        </pPr>
        <r>
          <t> &lt;HEAD&gt;</t>
        </r>
      </p>  
      <p>
        <pPr>
          <pStyle val="Programlisting"/>
        </pPr>
        <r>
          <t> &lt;BODY&gt;</t>
        </r>
      </p>  
    </sect>
  </body>
</wordDocument>


===XSL:===
<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
  xmlns:saxon="http://icl.com/saxon";
  extension-element-prefixes="saxon"

<xsl:output 
  version="1.0" 
  method="xml" 
  indent="yes" 
  encoding="iso-8859-1" 
  omit-xml-declaration="no" 
  standalone="no" 
  media-type="text/xml"
/>


<xsl:strip-space elements="*"/>

<xsl:param name="replace"/>

<xsl:template match="/">
  <xsl:apply-templates select="//*[not(parent::*)]"/>
</xsl:template>

<xsl:template match="*[not(parent::*)]">
  <xsl:element name="{local-name()}">
    <xsl:apply-templates select="@* | * | text() | comment()"/>
  </xsl:element>
</xsl:template>

<xsl:template match="p">
  <xsl:choose>      
    <xsl:when 
      test="
        pPr/pStyle[(_at_)val='Heading1']
        | 
        pPr/pStyle[(_at_)val='Programlisting']
      "
    >
      <xsl:if test="pPr/pStyle[(_at_)val='Heading1']">
        <title>
          <xsl:value-of select="r/t"/>
        </title>
      </xsl:if>
      <xsl:if test="pPr/pStyle[(_at_)val='Programlisting']">
        <xsl:if 
          test="
            count(
              preceding-sibling::p[pPr/pStyle[(_at_)val='Programlisting']]
            )=0
          "
        >
          <programlisting>
            <xsl:apply-templates 
              select="parent::*/p[pPr/pStyle[(_at_)val='Programlisting']]"
              mode="get_it"
            />
          </programlisting>
        </xsl:if>
      </xsl:if>
    </xsl:when>
    <xsl:otherwise>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="p[pPr/pStyle[(_at_)val='Programlisting']]"
mode="get_it">
  <xsl:text>&#xA;</xsl:text>
  <xsl:value-of select="normalize-space(r/t)"/>
  <xsl:if
test="count(following-sibling::p[pPr/pStyle[(_at_)val='Programlisting']])=0">
    <xsl:text>&#xA;</xsl:text>
  </xsl:if>
</xsl:template>

<xsl:template match="@*">
  <xsl:attribute name="{name()}">
    <xsl:value-of select="."/>
  </xsl:attribute>
</xsl:template>

<!-- comment() | text() template -->
<xsl:template match="comment()">
  <xsl:copy>
    <xsl:value-of select="."/>
  </xsl:copy>
</xsl:template>

<xsl:template match="text()">
  <xsl:value-of select="translate(., '&#xA;', '')"/>
</xsl:template>

</xsl:stylesheet>


===OUTPUT:===
<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
<wordDocument>
   <title>Erste Ueberschrift</title>
   <programlisting>
&lt;HTML&gt;
&lt;HEAD&gt;
&lt;BODY&gt;
</programlisting>
</wordDocument>



--- Silvia Liberto <SLiberto(_at_)gmx(_dot_)de> wrote:

hello again,

have someone an idea for my problem?
i don´t know where the mistake is?

i have another solution, without keys, but it doesn´t works too!?
Maybe its a small thing!?

can someone give me a tip?

Thanks!

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

 <xsl:template match="p">
 <programlisting>
  <xsl:call-template name="prog"/>
     </programlisting> 
</xsl:template>

<xsl:template match="r">
  <xsl:copy-of select="."/>
</xsl:template>

<xsl:template name="prog">
      
      <xsl:for-each  
select="following-sibling::p[pPr/pStyle/@val='Programlisting']">
              <xsl:value-of select="." />  
      </xsl:for-each>  
                              

</xsl:template>


</xsl:stylesheet>




Hi Wendell and all,

thanks for helping, i know what you mean when you say i should
try a
simpler
solution, but i need this key! ;-)

so i have changed my syntax on the @use attribute for
Programlisting.


generate-id(preceding-sibling::p[pPr/pStyle/@val='Heading1'][1])

but it still doesn´t works!? i have no grouping effect?

i can´t find the reason, have you another idea?

the output shoud be like this:

<programlisting>
&lt;HTML&gt;
&lt;HEAD&gt;
&lt;BODY&gt;
</programlisting>



<xsl:key name="prog" match="p[pPr/pStyle/@val='Programlisting']"




use="generate-id(preceding-sibling::p[pPr/pStyle/@val='Programlisting'][1])"/>
 

 <xsl:template match="p">
 <xsl:choose>                     
          <xsl:when test="pPr/pStyle/@val='Heading1'">
                  <title>
                          <xsl:value-of select="r/t"/>
                  </title>
          </xsl:when>
          <xsl:when test="pPr/pStyle/@val='Programlisting'">
  <programlisting>
                   <xsl:for-each select="key('prog',generate-id())">
                          <xsl:value-of select="r/t"/>
                   </xsl:for-each>         
          </programlisting>
          </xsl:when>
</xsl:choose>


</xsl:template>

</xsl:stylesheet>



XML:

<?xml version="1.0" encoding="UTF-8"?>
<!--<?mso-application progid="Word.Document"?>-->
<wordDocument>
  <body>
          <sect>
                  <p>
                          <pPr>
                                  <pStyle val="Heading1"/>
                          </pPr>
                          <r>
                                  <t>Erste Ueberschrift</t>
                          </r>
                  </p>
                  <p>
                          <pPr>
                                  <pStyle val="Programlisting"/>
                          </pPr>
                          <r>
                                  <t>&lt;HTML&gt;</t>
                          </r>
                  </p>
                  <p>
                          <pPr>
                                  <pStyle val="Programlisting"/>
                          </pPr>
                          <r>
                                  <t> &lt;HEAD&gt;</t>
                          </r>
                  </p>    
                  <p>
                          <pPr>
                                  <pStyle val="Programlisting"/>
                          </pPr>
                          <r>
                                  <t> &lt;BODY&gt;</t>
                          </r>
                  </p>    
          </sect>
  </body>
</wordDocument>




-- 
Telefonieren Sie schon oder sparen Sie noch?
NEU: GMX Phone_Flat http://www.gmx.net/de/go/telefonie



--~------------------------------------------------------------------
XSL-List info and archive: 
http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--


-- 
DSL-Aktion wegen großer Nachfrage bis 28.2.2006 verlängert:
GMX DSL-Flatrate 1 Jahr kostenlos* http://www.gmx.net/de/go/dsl


--~------------------------------------------------------------------
XSL-List info and archive: 
http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--


-- 
DSL-Aktion wegen großer Nachfrage bis 28.2.2006 verlängert:
GMX DSL-Flatrate 1 Jahr kostenlos* http://www.gmx.net/de/go/dsl

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



<Prev in Thread] Current Thread [Next in Thread>