2010-10-10 14 views
4

J'essaye d'analyser le XML suivant en utilisant JSTL. Je peux facilement récupérer tous les éléments dans le XML en dehors des balises avec le préfixe «t», comment puis-je faire cela?JSTL - analyse ne fonctionne pas pour les éléments avec espace de noms

XML ressemble (flux.xml)

<rss version="2.0" xmlns:t="http://www.xxx.co.uk/xxx"> 
<channel> 
    <title></title> 
    <link></link> 
    <description></description> 
    <language>en-uk</language> 
    <copyright></copyright> 
    <webMaster></webMaster> 
    <pubDate>Thu, 02 Sep 2010 16:56:49 +0100</pubDate> 
    <lastBuildDate>Thu, 02 Sep 2010 17:24:03 +0100</lastBuildDate> 
    <ttl></ttl> 

    <image> 
     <title></title> 
     <link></link> 
     <width></width> 
     <height></height> 
     <url></url> 
    </image> 

    <category></category> 

    <item> 
     <title>Title text 1</title> 
     <link>http://a.b.com/link1</link> 
     <description>Description text 1</description> 
     <enclosure url="http://a.b.com/xxxx/yyyy1.jpg" length="999" type="image/jpeg" /> 
     <guid>Unique-identifier-1</guid> 
     <test> 
      <test1>azman</test1> 
     </test> 
     <t:fields> 
      <t:isfeatured>true</t:isfeatured> 
     </t:fields> 
    </item> 
</channel> 

et mon JSTL ressemble à ceci

<c:import url="feed.xml" var="xml"/><x:parse xml="${xml}" var="doc"/> 

qui suit retourne "texte Titre 1"

<x:out select="$doc/rss/channel/item/title" /> 

Cependant, le foll provoquera l'dû erreur suivant

<x:out select="$doc/rss/channel/item/t:fields/t:isfeatured" /> 

Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException (JspServletWrapper.java:510) org.apache.jasper.servlet.JspServletWrapper.service (JspServletWrapper.java : 401) org.apache.jasper.servlet.JspServlet.serviceJspFile (JspServlet.java:313) org.apache.jasper.servlet.JspServlet.service (JspServlet.java:260) javax.servlet.http.HttpServlet. service (HttpServlet.java:717) cause racine

javax.servlet.ServletException: jav ax.servlet.jsp.JspTagException: Erreur lors de l'évaluation de l'expression XPath "/ rss/channel/item/t: champs/t: isfeatured": javax.xml.transform.TransformerException: le préfixe doit être résolu en un espace de noms: t org.apache. jasper.runtime.PageContextImpl.doHandlePageException (PageContextImpl.java:858) org.apache.jasper.runtime.PageContextImpl.handlePageException (PageContextImpl.java:791) org.apache.jsp.index_jsp._jspService (index_jsp.java:106) org.apache.jasper.runtime.HttpJspBase.service (HttpJspBase.java:70) javax.servlet.http.HttpServlet.service (HttpServlet.java:717) org.apache.jasper.servlet.JspServletWrapper.service (JspServletWrapper .java: 377) org.apache.jasper.servlet.JspServlet.serviceJspFile (JspServlet.java:313) org.apache.jasper.servlet.JspSe rvlet.service (JspServlet.java:260) javax.servlet.http.HttpServlet.service (HttpServlet.java:717) causes profondes

javax.xml.transform.TransformerException: Prefix doit se résoudre à un espace de noms: t org.apache.xpath.compiler.XPathParser.error (XPathParser.java:640) org.apache.xpath.compiler.Lexer.mapNSTokens (Lexer.java:676) org.apache.xpath.compiler.Lexer.tokenize (Lexer.java:303) org.apache.xpath.compiler.Lexer.tokenize (Lexer.java:134) org.apache.xpath.compiler.XPathParser.initXPath (XPathParser.java:146) org.apache. xpath.XPath. (XPath.java:200) org.apache.taglibs.standard.tag.common.xml.JS TLXPathAPI.eval (JSTLXPathAPI.java:285) org.apache.taglibs.standard.tag.common.xml.XPathUtil.valueOf (XPathUtil.java:472) org.apache.taglibs.standard.tag.common.xml. ExprSupport.doStartTag (ExprSupport.java:64) org.apache.jsp.index_jsp._jspx_meth_x_005fout_005f0 (index_jsp.java:173) org.apache.jsp.index_jsp._jspService (index_jsp.java:91) org.apache.jasper .runtime.HttpJspBase.service (HttpJspBase.java:70) javax.servlet.http.HttpServlet.service (HttpServlet.java: 717) org.apache.jasper.servlet.JspServletWrapper.service (JspServletWrapper.java:377) org.apache.jasper.servlet.JspServlet.serviceJspFile (JspServlet.java:313) org.apache.jasper.servlet .JspServlet.service (JspServlet.java:260) javax.servlet.http.HttpServlet.service (HttpServlet.java:717)

Merci pour toute aide!

+0

Lorsque vous entrez du code, en particulier du code XML, n'oubliez pas de mettre en retrait 4 espaces pour qu'il ne soit pas analysé par SO (le XML est fortement altéré sauf s'il est indenté). Il y a aussi un bouton au-dessus de la zone d'entrée de texte (01010101) qui indentera les blocs sélectionnés pour vous. –

+0

Je viens de faire ce que vous avez suggéré, merci –

+0

+1 Une question bien écrite avec des informations complètes. Bienvenue à SO. –

Répondre

0

Bien que votre document spécifie une déclaration d'espace de noms, le moteur XPath invoqué à partir du code JSTL ne connaît pas l'espace de noms, qui est fourni pour Xalan dans un contexte d'espace de noms. Je ne connais pas JSTL, mais vous pourriez étudier comment définir un contexte d'espace de noms pour JSTL.

J'ai recherché sur jstl xpath namespace context et j'ai obtenu un interesting hit, qui malheureusement ne contient pas de solution.

EDIT: On dirait que vous pouvez le faire en JSTL 1.0 seulement avec la fonction namespace-uri(), conduisant à de longues expressions XPath difficiles à lire. Voir here

+1

Merci pour votre aide. J'ai essayé d'utiliser la fonction namespace-uri() mais encore une fois rien n'a été retourné

+0

supprime le" t: "dans les champs t: puisque vous spécifier l'espace de noms et spécifier uniquement l'espace de noms sur les éléments qui lui appartiennent – elzapp