尝试从SOAP响应中检索SOAP正文,但是收到此错误:
NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces.
Document doc = soapResMsg.getSOAPBody().extractContentAsDocument(); -- Exception is thrown here
org.dom4j.io.DOMReader d4Reader = new org.dom4j.io.DOMReader();
org.dom4j.Document d4doc = d4Reader.read(doc);
Run Code Online (Sandbox Code Playgroud)
使用Saaj1.4
对此有什么解决方法?
我想在xml文档中添加一个元素,我想将参数作为参数传递给元素.
sample.xml文件:
<?xml version="1.0"?>
<stuff>
<element1>
<foo>2</foo>
<bar/>
</element1>
<element2>
<subelement/>
<bar/>
</element2>
<element1>
<foo/>
<bar/>
</element1>
</stuff>
Run Code Online (Sandbox Code Playgroud)
使用:
xalan.exe -p myparam "element1" sample.xml addelement.xslt
Run Code Online (Sandbox Code Playgroud)
我想得到以下结果:
<?xml version="1.0"?>
<stuff>
<element1>
<foo>2</foo>
<bar/>
<addedElement/>
</element1>
<element2>
<subelement/>
<bar/>
</element2>
<element1>
<foo/>
<bar/>
<addedElement/>
</element1>
</stuff>
Run Code Online (Sandbox Code Playgroud)
我已经设法编写addelement.xslt,当硬编码它的工作路径时,但是当我尝试在match属性中使用参数myparam时,我得到:
XPathParserException: A node test was expected.
pattern = '$myparam/*[last()]' Remaining tokens are: ('$' 'myparam' '/' '*' '[' 'last' '(' ')' ']') (addelement.xslt, line 12, column 42)
Run Code Online (Sandbox Code Playgroud)
addelement.xslt
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()"> …Run Code Online (Sandbox Code Playgroud) 我正在使用xalan和以下xsl标头:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:redirect="http://xml.apache.org/xalan/redirect"
extension-element-prefixes="redirect"
xmlns:xalan="http://xml.apache.org/xalan">
<xsl:output method="text" indent="yes" xalan:indent-amount="4"/>
Run Code Online (Sandbox Code Playgroud)
并且输出没有缩进.
谁有想法?
我有以下代码:
javax.xml.transform.TransformerFactory factory = TransformerFactory.newInstance();
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
javax.xml.transform.Transformer transformer = factory.newTransformer();
Run Code Online (Sandbox Code Playgroud)
这正常工作正常。但是,我还需要在我的 pom.xml 中添加 Xalan 作为依赖项,当我这样做时,上面的代码现在抛出一个错误:
java.lang.IllegalArgumentException: Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD
Run Code Online (Sandbox Code Playgroud)
我认为这与 Xalan 的 jar 中有不同的 Transformer 实现有关。如何在不更改上述代码并将 Xalan 作为依赖项的情况下解决此冲突?
我在我的应用程序中看到,在我的解析XML文件中包含xinclude在我的Java XSLT转换中不起作用.
但是,虽然我这样做:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setXIncludeAware(true);
Run Code Online (Sandbox Code Playgroud)
我不是专门设置变压器工厂为System.getProperty("javax.xml.transform.TransformerFactory")返回"null".
我的问题:默认的Java(1.6或6)是否支持xinclude,还是我必须添加替代的XSLT解析器,例如Apache Xerces?
类org.apache.xalan.processor.TransformerFactoryImpl线程安全吗?或者我必须为每个线程保留本地副本?
更新17.Jul.2013:
XALAN 2.7 不缓存 document()请求中的呼叫.因此,将每个所需文档存储在XSL中的变量中至关重要.
我已经搜索了很长一段时间,并没有找到我的简单问题的具体答案:
哪种方法更快或者编译器是否"足够"以便两种变体都相同?
注意:我使用的是Xalan 2.7(JDK 1.6中的默认实现):
1)我必须读取外部XML中的属性:
<xsl:value-of select="document($path)/person/address/city"/>
Run Code Online (Sandbox Code Playgroud)
每当我需要这个城市时,我都会使用上面的表达式(让我们说100次)
2)我没有调用document()100次,而是将XML节点存储在变量中:
<xsl:variable name="node" select="document($path)"/>
Run Code Online (Sandbox Code Playgroud)
然后我用了100次
<xsl:value-of select="$node/person/address/city"/>
Run Code Online (Sandbox Code Playgroud)
哪一个更快,更好,原因是什么?谢谢!
我收到以下错误:
javax.servlet.ServletException: Cannot find a matching 1-argument function named {http://exslt.org/dynamic}evaluate()
at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:841)
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:774)
Run Code Online (Sandbox Code Playgroud)
我的xslt文件的顶部是
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:dyn="http://exslt.org/dynamic"
extension-element-prefixes="dyn">
Run Code Online (Sandbox Code Playgroud)
你知道为什么我会收到这个错误吗?
UPDATE
我的XML文件的顶部现在读取.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:xalan="http://xml.apache.org/xalan"
exclude-result-prefixes="xalan">
Run Code Online (Sandbox Code Playgroud)
我们失败的XML是
<xsl:template name="test">
<xsl:param name="param" />
<xsl:value-of select="$param"/>
<xsl:value-of select="xalan:evaluate($param)"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
此代码适用于运行Tomcat 5.0的一台服务器,但不能在运行Tomcat 5.5的服务器上运行.我想是因为代码在一台服务器上运行而不是环境问题.
XSLT通过JSP页面应用于XML.对我来说,看起来没有使用xalan.jar文件.JSP的顶部是:
<%@page import="javax.xml.transform.*"%>
<%@page import="javax.xml.transform.stream.*"%>
<%@page import=" java.security.Principal,
java.net.URL,
java.net.URLConnection,
java.io.InputStream,
java.io.InputStreamReader,
java.io.Reader,
java.io.BufferedReader,
java.io.File,
javax.xml.transform.*,
javax.xml.transform.stream.*,
javax.xml.transform.*,
javax.xml.transform.stream.*"%>
Run Code Online (Sandbox Code Playgroud)
更新 问题是Saxon被选为XML解析器.Saxon不支持此功能.删除Saxon.jar可以解决问题.
我试图传递一个w3c.dom.Document,Element并NodeList作为参数传递给xslt变换.
我希望能够在xslt中处理它:
<xsl:param name="links" />
<xsl:template match="/">
<record>
<xsl:for-each select="$links/*">
<test />
</xsl:for-each>
</record>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
我将参数传递为:
Document params = createLinksParams(links);
transformer.setParameter("links", params);
Run Code Online (Sandbox Code Playgroud)
我得到这个例外:
'从'com.sun.org.apache.xerces.internal.dom.DocumentImpl'到'node-set'的转换无效.'
我也试过exslt:node-set(),xalan:nodeset()等等,但它不工作.
似乎内部xalan除了他自己的Node实现.
如何在不引发此问题的情况下做类似的事情?
我无法使用,document($param)因为我在运行中构建了doc.
我目前正在使用Xalan 2.7.0进行基于XML的XSLT转换,但考虑切换到Saxon 9版本进行XSLT转换.所以有人可能会列出使用Saxon而不是Xalan的主要缺点和利弊.虽然我知道Saxon支持XSLT 2.0和其他重大变化,但我想更多地了解Saxon 9的个人经历及其prons和cons以及其他好处.