[ http://issues.apache.org/jira/browse/JELLY-213?page=all ]

Diogo Bacelar Quintela updated JELLY-213:
-----------------------------------------

    Attachment: jelly-patch3.patch

Here is patch3 :)

AtributeTag and ElementTag are exactly the same as patch 1
XMLOutput now has a stack of namespaces, and manages the calls to 
startPrefixMapping and endPrefixMapping.
It passes common testcases and jelly-xml testcases (haven't tried the others :)

It now generates equivalent outputs in both cases (described in above java 
class TestNS) 
[equivalent means equivalent xml, not necessarly the same order of attributes].

I've included a new tag, that i mentionated some comments above.
A ReplaceNamespaceTag. As it name implies, it replaces all namespaces from one 
uri to another in its body (fromURI and toURI properties).
XMLOutput does it job perfectly, again :)


Ex:

<?xml version="1.0" encoding="UTF-8"?>
<j:jelly xmlns:j="jelly:core" xmlns:x="jelly:xml">
    <x:element URI="${ns}" name="test-node">
        <x:attribute URI="http://apache/testNS"; name="test:abc" 
trim="true">testValue</x:attribute>

        <test-subnode attr="test">
            <test-anotherSubNode />
            <x:element URI="${ns}" name="test-anotherSubNodeAgain">
                <x:attribute URI="${ns}" name="other:abc" 
trim="true">testValue</x:attribute>
            </x:element>
        </test-subnode>

        <x:replaceNamespace toURI="${ns}">
            <test-subnode attr="test">
                <test-anotherSubNode />
                <x:element URI="${ns}" name="test-anotherSubNodeAgain">
                    <x:attribute URI="${ns}" name="other:abc" 
trim="true">testValue</x:attribute>
                </x:element>
            </test-subnode>
        </x:replaceNamespace>
    </x:element>
</j:jelly>

Generates

When 'ns' is empty/inexistent

<test-node xmlns:test="http://apache/testNS"; test:abc="testValue">
<test-subnode attr="test">
<test-anotherSubNode>
</test-anotherSubNode>
<test-anotherSubNodeAgain xmlns:other="" other:abc="testValue">
</test-anotherSubNodeAgain>
</test-subnode>
</test-node>

And when 'ns' if for example 'http://java/ns'

<test-node xmlns:test="http://apache/testNS"; xmlns="http://java/ns"; 
test:abc="testValue">
<test-subnode xmlns="" attr="test">
<test-anotherSubNode>
</test-anotherSubNode>
<test-anotherSubNodeAgain xmlns:other="http://java/ns"; xmlns="http://java/ns"; 
other:abc="testValue">
</test-anotherSubNodeAgain>
</test-subnode>
<test-subnode attr="test">
<test-anotherSubNode>
</test-anotherSubNode>
<test-anotherSubNodeAgain xmlns:other="http://java/ns"; other:abc="testValue">
</test-anotherSubNodeAgain>
</test-subnode>
</test-node>

Usefull ? I'll demonstrate with my example.
I am working in ejb plugin for xdoclet-plugins project, 
the plugins for xdoclet2 project.

plugin.version.isDtd says true if we need an dtd, false, if we are using a 
schema.
If we are using a dtd, we don't need a namespace, if we are using a schema we 
need to use 'http://java.sun.com/xml/ns/j2ee' as
default namespace. So plugin.version.ns return null when is a dtd, and 
'http://java.sun.com/xml/ns/j2ee' when its not.
With this 'replaceNamespace' tag we can use the default namespace in jelly 
script, 
(replacing "" for "" let's it exactly the same :D) for dtd output, and when 
plugin.version.ns
is http://java.sun.com/xml/ns/j2ee all nodes get automatically updated to that 
namespace.

It will be usefull for xdoclet-plugins, and maybe for other projects.


<?xml version="1.0" encoding="UTF-8"?>
<j:jelly xmlns:j="jelly:core" xmlns:x="jelly:xml" xmlns:jsl="jelly:jsl">
    <j:if test="${plugin.version.isDtd()}">
        <x:doctype name="ejb-jar" publicId="${plugin.version.publicId}" 
systemId="${plugin.version.systemId}" trim="true" />
    </j:if>
    <x:element URI="${plugin.version.ns}" name="ejb-jar">
        <j:if test="${!plugin.version.isDtd()}">
            <x:attribute URI="${plugin.version.xsiNs}" 
name="xsi:schemaLocation" 
trim="true">${plugin.version.schemaLocation}</x:attribute>
            <x:attribute name="version" 
trim="true">${plugin.version.version}</x:attribute>
        </j:if>
        <x:replaceNamespace toURI="${plugin.version.ns}" 
includeAttributes="true">
            <enterprise-beans>
                <j:forEach var="class" items="${metadata}">
                    <j:if test="${plugin.shouldGenerate(class)}">
                        <entity>
                            
<ejb-name>${plugin.ejbUtils.getEjbName(class)}</ejb-name>
                            ....
                        </entity>
                    </j:if>
                </j:forEach>
            </enterprise-beans>
        </x:replaceNamespace>

        <j:import uri="org/xdoclet/plugin/ejb/descriptor/entity-beans.jelly" 
inherit="true"/>
    </x:element>
    <!--</ejb-jar> -->
</j:jelly>

If this patch is usefull as a full (as i think it is), 
i'd be happy to known when it gets added to jelly project, and jelly-xml.

> Generating xml nodes with attributes in diferente namespaces (for schemas..)
> ----------------------------------------------------------------------------
>
>          Key: JELLY-213
>          URL: http://issues.apache.org/jira/browse/JELLY-213
>      Project: jelly
>         Type: Bug
>     Reporter: Diogo Bacelar Quintela
>  Attachments: jelly-patch3.patch, jelly-xml-updated.patch, jelly-xml.patch
>
> I tried to find some info googling around and in the faq and couldn't find
> the answer, so here it goes.
> I need to generate the following xml (it's a sample off course), to support
> schemas.
> ------------------------------------------------
> <NodeName 
> xmlns="http://blah/bleh"; 
> xmlns:xsi="http://www.w3.org/2001/XMLSchema"; 
> xsi:schemaLocation="http://blah/blehSchemaLocation";>
> <!-- Other content here -->
> </NodeName>
> ------------------------------------------------
> After several tries and some inconsistent behaviour, I thought the following
> jelly excerpt should be close to the solution, however "xml:attribute"
> doesn't support namespaces values.
> ------------------------------------------------
> <j:jelly xmlns:j="jelly:core" xmlns:x="jelly:xml">
>       <x:element URI="${myns}" name="NodeName">
>               <x:attribute 
>                       name="xsi:schemaLocation" 
>                       URI="${myxsins}" 
>                       trim="true">
>               ${myschemaloc}
>               </x:attribute>
>               <!-- Other content here -->
>       <x:element>
> </j:jelly>
> Where 
> "myns" is for example http://blah/bleh
> "myschemaloc" is for example http://blah/blehSchemaLocation
> "myxsins" is for example http://www.w3.org/2001/XMLSchema
> ------------------------------------------------
> Is there any known solution for this problem?  Even if working only for
> schemas?

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to