Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Xalan-J:解析扩展函数中QName文本值的命名空间_Java_Xml_Xslt_Xml Namespaces_Xalan - Fatal编程技术网

Java Xalan-J:解析扩展函数中QName文本值的命名空间

Java Xalan-J:解析扩展函数中QName文本值的命名空间,java,xml,xslt,xml-namespaces,xalan,Java,Xml,Xslt,Xml Namespaces,Xalan,我实现了一个简单的XPath扩展函数,打算在XSLT转换期间由Xalan-J调用。调用部分很简单,但我不理解的是函数的实现应该如何访问被转换文档的名称空间上下文(而不是转换上下文,作为扩展函数的第一个参数提供)。我需要这个上下文来解析实际上是qname的元素文本值的名称空间 以下是需要转换的示例文档: 价值:一些价值 value:some value是我想要解析的QName文本值的一个示例-它表示org.stackoverflow.example.value命名空间中的some value

我实现了一个简单的XPath扩展函数,打算在XSLT转换期间由Xalan-J调用。调用部分很简单,但我不理解的是函数的实现应该如何访问被转换文档的名称空间上下文(而不是转换上下文,作为扩展函数的第一个参数提供)。我需要这个上下文来解析实际上是qname的元素文本值的名称空间

以下是需要转换的示例文档:


价值:一些价值
value:some value
是我想要解析的QName文本值的一个示例-它表示
org.stackoverflow.example.value
命名空间中的
some value

转换如下所示:


它本质上只是调用我的扩展函数,其中node
元素
是唯一的参数

因此,实际代码如下所示(类路径中需要Xalan-J 2.7.1):

package org.stackoverflow.example;
导入java.io.*;
导入javax.xml.transform.*;
导入javax.xml.transform.stream.*;
导入org.apache.xalan.extensions.ExpressionContext;
导入org.w3c.dom.NamedNodeMap;
导入org.w3c.dom.Node;
导入org.w3c.dom.traversal.NodeIterator;
公共类XPathFunctionQNameTextValueResolver{
公共静态最终布尔resolveQNameTextValue(ExpressionContext ctx,NodeInterator节点){
Node=nodes.nextNode();
while(节点!=null){
if(node.hasChildNodes()){
字符串textValue=node.getFirstChild().getNodeValue();
字符串[]pfxAndName=textValue.split(“:”);
字符串前缀=”;
字符串名称=textValue;
如果(pfxAndName.length==2){
前缀=pfxAndName[0];
name=pfxAndName[1];
}
String namespace=node.lookupNamespaceURI(前缀);
//“名称空间”始终为null,除非null作为“前缀”提供,后者返回默认名称空间
NamedNodeMap attributes=node.getAttributes();
如果(属性!=null){
//“属性”不包含任何“xmlns”属性
}
System.out.println(
字符串格式(
“命名空间:%s,前缀:%s,本地名称:%s,属性len:%d”,
名称空间、前缀、名称、属性!=null?attributes.getLength():0);
}
node=nodes.nextNode();
}
返回false;
}
公共静态void main(字符串[]args)引发TransformerConfiguration异常,TransformerException{
字符串xslt=“”+
“\n”+
“\n”+
“\n”+
“\n”+
"";
String document=“”+
“\n”+
“值:某些值\n”+
"";
TransformerFactory XalantTransfact=new org.apache.xalan.processor.TransformerFactoryImpl();
Templates template=xalantransact.newTemplates(新StreamSource(新StringReader(xslt));
StringWriter编写器=新的StringWriter();
Transformer Transformer=模板.newTransformer();
transform(新StreamSource(新StringReader(document)),新StreamResult(writer));
}
}
期望
node.lookupNamespaceURI(前缀)
将提供我需要的名称空间,但事实并非如此。
节点实际上是DOM模型中的一个节点,但这些节点似乎不包含任何名称空间信息。这就像产生这些节点的解析器配置错误,完全忽略了名称空间


如何更改我的示例,以便在运行时执行XPath函数时显示名称空间信息?

根据@MartinHonnen在注释中的建议,如果需要名称空间,您需要自己提供名称空间感知输入文档解析器:

DocumentBuilderFactory=DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder=factory.newDocumentBuilder();
documentparse=builder.parse(新的InputSource(新的StringReader(文档));
transform(新的DOMSource(parse),新的StreamResult(writer));
更正的示例:

package org.stackoverflow.example;
导入java.io.*;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入javax.xml.parsers.parserConfiguration异常;
导入javax.xml.transform.*;
导入javax.xml.transform.dom.DOMSource;
导入javax.xml.transform.stream.*;
导入org.apache.xalan.extensions.ExpressionContext;
导入org.w3c.dom.Document;
导入org.w3c.dom.NamedNodeMap;
导入org.w3c.dom.Node;
导入org.w3c.dom.traversal.NodeIterator;
导入org.xml.sax.InputSource;
导入org.xml.sax.SAXException;
公共类XPathFunctionQNameTextValueResolver{
公共静态最终布尔resolveQNameTextValue(ExpressionContext ctx,NodeInterator节点){
Node=nodes.nextNode();
while(节点!=null){
if(node.hasChildNodes()){
字符串textValue=node.getFirstChild().getNodeValue();
字符串[]pfxAndName=textValue.split(“:”);
字符串前缀=”;
字符串名称=textValue;
如果(pfxAndName.length==2){
前缀=pfxAndName[0];
name=pfxAndName[1];
}
String namespace=node.lookupNamespaceURI(前缀);
//“名称空间”始终为null,除非null作为“前缀”提供,后者返回默认名称空间
NamedNodeMap attributes=node.getAttributes();