That still doesn't seem to address the question about adding an attribute. If
the attribute doesn't exist, you can't access it with something like
domCtx.getPointer("root/child/@id"), right? I took a look at the API and this
seemed to work (JSTL 1.1, Xalan 2.6.0, and Xerces 2.6.2 on TC 5.0.19):

<%@ page contentType="text/plain" %>
<%@ page import="org.apache.commons.jxpath.*" %>
<%@ page import="org.w3c.dom.*" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"; %>

<x:parse varDom="dom">
    <root>
        <child>Child 1</child>
        <child>Child 2</child>
        <child>Child 3</child>
    </root>
</x:parse>

child:    <x:out select="$dom/root/child"/>
child id: <x:out select="$dom/root/child/@id"/>

<jsp:useBean id="dom" type="org.w3c.dom.Document"/>
<%
JXPathContext domCtx = JXPathContext.newContext(dom);
Pointer ptr = domCtx.getPointer("root/child");
Element elem = (Element)ptr.getNode();
elem.setAttribute("id", "1");
%>

child:    <x:out select="$dom/root/child"/>
child id: <x:out select="$dom/root/child/@id"/>

Which produced:

child:    Child 1
child id: 

child:    Child 1
child id: 1

It looks like there's also a way to add an attribute through the JXPath API, but
you have to cast the Pointer to a NodePointer and the code's a bit uglier. Of
course, if you're gonna drop down to Java, there are lots of other options for
programmatically modifying DOM through XPath...

Quoting "Mark R. Diggory" <[EMAIL PROTECTED]>:

> 
> You can use JXPath to manipulate the content of the DOM directly (ie 
> without having to instantiate a whole new copied DOM object to establish 
> your changes (as you whould have to do with XSLT).
> 
> Say you instantiate some DOM Document object, you can use JXPath as such:
> 
> Document doc = ....;
> JXPathContext context = JXPathContext.newContext(doc);
> 
> Iterator iter = context.iteratePointers("//some[xpath]");
> while (iter.hasNext()) {
>       Pointer pointer = (Pointer) iter.next();
>       System.out.println("value before change: " + pointer.getValue());
>       pointer.setValue(value);
>       System.out.println("value after change: " + pointer.getValue());
> }
> 
> .. Serialize your DOM to wherever using whatever.
> 
> Yes, by scriptable, I mean you can write your java code between <%%> or 
> <jsp:scriptlet></jsp:scriptlet>
> 
> Maybe someday there'll be a JXPath taglibrary which would make all this 
> all grovy in JSP.
> 
> -Mark
> 
> Kris Schneider wrote:
> 
> >I'm not too familiar with JXPath, and I'm sure it's useful in other
> contexts,
> >but I don't see how it's applicable to Murray's problem. Can it be used to
> add
> >an attribute to an existing element? I'm also not sure I get the point
> about
> >"JXPath can be scripted into a JSP". Do you mean something besides:
> >
> ><%
> >Foo fooCtx = (Foo)JXPathContext.newContext(myFoo);
> >%>
> >
> >Quoting "Mark R. Diggory" <[EMAIL PROTECTED]>:
> >
> >  
> >
> >>This is outside the scope of the taglibrary, JSTL xml taglibrary is for 
> >>presentation of xml content, not for its manipulation. I recommend 
> >>looking into a package such as JXPath to accomplish manipulation of the 
> >>content of a DOM object. the nice thing is that JXPath can be scripted 
> >>into a JSP, Servlet or Struts Action, which gives you the fredom to move 
> >>it out of the Presentation layer (where you probibly shouldn't be 
> >>placing such logic).
> >>
> >>http://jakarta.apache.org/commons/jxpath/
> >>
> >>Good Luck
> >>-Mark
> >>
> >>Murray Lang wrote:
> >>
> >>    
> >>
> >>>Hi
> >>>I've been using the XML tags in JSTL and found them very useful, 
> >>>however now I need to add an attribute to an XML element and have hit 
> >>>a brick wall.
> >>>
> >>>I've tried using <c:set> and EL, treating a DOM object as a bean, but 
> >>>the DOM interface is implementation-dependent and my implementation 
> >>>(xerces) doesn't lend itself to adding attributes with the simple EL 
> >>>view of bean properties.
> >>>
> >>>It seems to me that <x:set> needs to have a "target"attribute along 
> >>>the same lines as <c:set>, but accepting an XPath expression.
> >>>eg
> >>>    <x:set select="12345" 
> >>>target="$myRoot//myElement[position()=0]/@myAttribute" />
> >>>where:
> >>>    - select can be either an XPath expression or an immediate value.
> >>>    - if @myAttribute doesn't currently exist in the element then it 
> >>>is created.
> >>>
> >>>Does this make sense?
> >>>Is there a simple, portable, way of achieving this using JSTL as it 
> >>>stands? (Using <c:set> is not portable due to DOM being implementation 
> >>>dependent).
> >>>
> >>>Thanks
> >>>Murray

-- 
Kris Schneider <mailto:[EMAIL PROTECTED]>
D.O.Tech       <http://www.dotech.com/>

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

Reply via email to