Narazim na problem.
To moje XML, ktere chci transformovat pomoci XSLT ma nekolik desitek tisic radku. Kdyz na to pustim tuto transformaci, tak Java vyhodi vyjimku (asi po 20 vterinach behu transformace):

Exception in thread "main" java.lang.StackOverflowError
at com.sun.org.apache.xml.internal.serializer.WriterToUTF8Buffered.write(Unknown Source) at com.sun.org.apache.xml.internal.serializer.ToStream.processAttributes(Unknown Source) at com.sun.org.apache.xml.internal.serializer.ToStream.closeStartTag(Unknown Source) at com.sun.org.apache.xml.internal.serializer.ToStream.characters(Unknown Source) at com.sun.org.apache.xml.internal.utils.FastStringBuffer.sendSAXcharacters(Unknown Source) at com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.SAX2DTM2.copyTextNode(Unknown Source) at com.sun.org.apache.xalan.internal.xsltc.dom.SAXImpl.shallowCopy(Unknown Source) at com.sun.org.apache.xalan.internal.xsltc.dom.DOMAdapter.shallowCopy(Unknown Source)

pouzivam tento kod transformace:

TransformerFactory tfactory = TransformerFactory.newInstance();
Templates template = tfactory.newTemplates(s_XSLfile);
javax.xml.transform.Transformer transformer = template.newTransformer();
transformer.transform(s_XMLfile, result);

Martin



Martin Kuba napsal(a):
Martin Jedlička napsal(a):
Zdravim,

  mam dotaz ohledne hledani elementu v XML souboru.
Mam nize uvedeny XML soubor (tento soubor je upraveny format DWARF2), ktery obsahuje jednotlive elementy. Kazdy element ma nejake 'idref', ktery odkazuje da dalsi element. Priklad : variable -> volatile_type -> far_type -> typedef -> structure_type A potrebuju zjistit nejakym dotazem nazev struktury (t_bitStruktura), jeji polozky (b0, b1) atd...
Mam na toto pouzit XPath nebo XQuery? Co je lepsi? Nejaky priklad?

Napsal jsem si krátkou XSLT trasnformaci, která vloží
odkazované tagy na místo tagu <ref>:

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";> <xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/>

    <xsl:template match="/">
        <xsl:apply-templates select="/root/variable"/>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ref">
        <xsl:variable name="idval" select="string(@idref)"/>
        <xsl:apply-templates select="//[EMAIL PROTECTED]" />
    </xsl:template>

</xsl:stylesheet>

a když tím vstupní data proženu, dostanu pěkně stromovou strukturu:

<variable id="0x6b">
    <location>0x00000000</location>
    <name>promenna1</name>
    <volatile_type id="0x5ab">
        <far_type id="0x5b0">
            <typedef id="0x596">
                <name>t_bitStruktura</name>
                <structure_type id="0x4b8">
                    <name>t_bitStruktura</name>
                    <byte_size>

    ... atd.

a v té už se dají informace snadno nalézt pomocí XPath, např.
název struktury

   /variable/volatile_type/far_type/typedef/name/text()

Takže bych to dělal transformací a následně XPath.

Makub

Odpovedet emailem