JSTL - синтаксический анализ не работает для элементов с пространством имен

Я пытаюсь разобрать следующий XML с помощью JSTL. Я могу легко получить все элементы в XML, кроме тегов с префиксом «t», как мне это сделать?

XML выглядит так (feed.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>

and my JSTL looks like this

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

Следующее вернет «Текст заголовка 1»

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

Однако следующее вызовет следующую ошибку

<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) основная причина

javax.servlet.ServletException: javax.servlet.jsp.JspTagException: ошибка при оценке выражения XPath "/rss/channel/item/t:fields/t:isfeatured": javax.xml.transform.TransformerException: префикс должен разрешаться в пространство имен: 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.JspServlet.service(JspServlet.java:260) javax.servlet.http.HttpServlet.service (HttpServlet.java:717) основная причина

javax.xml.transform.TransformerException: Префикс должен разрешаться в пространство имен: 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.JSTLXPathAPI.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) орг.ап ache.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)

Спасибо за любую помощь!


person A Edwards    schedule 10.10.2010    source источник
comment
При вводе кода, особенно XML, не забудьте сделать отступ в 4 пробела, чтобы он не анализировался SO (XML сильно искажается, если он не имеет отступа). Там также есть кнопка над областью ввода текста (01010101), которая сделает для вас отступ выбранных блоков.   -  person Jim Garrison    schedule 10.10.2010
comment
Я просто сделал то, что вы предложили, спасибо   -  person A Edwards    schedule 10.10.2010
comment
+1 Хорошо написанный вопрос с полной информацией. Добро пожаловать в СО.   -  person Jim Garrison    schedule 10.10.2010


Ответы (1)


Похоже, что хотя в вашем документе указано объявление пространства имен, механизм XPath, вызываемый из кода JSTL, не знает о пространстве имен, которое для Xalan предоставляется в контексте пространства имен. Я не знаком с JSTL, но вы можете выяснить, как установить контекст пространства имен для JSTL.

Я погуглил jstl xpath namespace context и нашел один интересный ответ. , который, к сожалению, не содержит решения.

РЕДАКТИРОВАТЬ: похоже, вы можете сделать это в JSTL 1.0 только с функцией namespace-uri(), что приводит к длинным, трудным для чтения выражениям XPath. См. здесь

person Jim Garrison    schedule 10.10.2010
comment
Спасибо за вашу помощь. Я попытался использовать функцию namespace-uri(), но снова ничего не было возвращено ‹x:out select=$doc/rss/channel/item/t:fields[namespace-uri() = 'xxx.com/xxx']/t:isfeatured[namespace-uri() = 'xxx.com/xxx'] /› - person A Edwards; 10.10.2010
comment
отбросьте t: в полях t:, поскольку вы указываете пространство имен и указываете пространство имен только для элементов, которые ему принадлежат - person elzapp; 21.09.2011