Java XSL转换,然后在结果节点上使用XPath表达式
我正在对输入XML进行XSL转换,然后需要在生成的文档上使用XPath提取一些值。但在使用XSL结果节点时,XPath表达式可能总是返回null。 但是如果我将XSL结果文档存储在一个文件中,然后重新加载它。XPath表达式返回相应的节点 这是我的代码(为了便于理解,实用功能已被删除): 只需注释或删除“//Store”下面的3行,然后重新加载文件,“测试将不再通过”Java XSL转换,然后在结果节点上使用XPath表达式,java,xml,xslt,xpath,Java,Xml,Xslt,Xpath,我正在对输入XML进行XSL转换,然后需要在生成的文档上使用XPath提取一些值。但在使用XSL结果节点时,XPath表达式可能总是返回null。 但是如果我将XSL结果文档存储在一个文件中,然后重新加载它。XPath表达式返回相应的节点 这是我的代码(为了便于理解,实用功能已被删除): 只需注释或删除“//Store”下面的3行,然后重新加载文件,“测试将不再通过” 我完全卡住了,欢迎任何帮助。我想知道解析文件是否会让您的树变短。尝试使用xpath表达式 //Message/Out/Perso
我完全卡住了,欢迎任何帮助。我想知道解析文件是否会让您的树变短。尝试使用xpath表达式
//Message/Out/Personne/CodeCivilite
(前面的双斜杠)没有文件i/o,以查看是否有没有文件i/o的额外节点层 我想知道解析文件是否会使您的树变短。尝试使用xpath表达式
//Message/Out/Personne/CodeCivilite
(前面的双斜杠)没有文件i/o,以查看是否有没有文件i/o的额外节点层 node=loadXmlFromInputStream(新文件InputStream(xslOutputfile))。
getDocumentElement
()
是getDocumentElement()吗
您能打印重新加载的节点并查看是否具有所需的内容吗?节点=loadXmlFromInputStream(新文件InputStream(xslOutputfile))。
getDocumentElement
()
是getDocumentElement()吗
是否可以打印重新加载的节点并查看是否具有所需的名称空间?DocumentBuilderFactory默认情况下不使用名称空间,除非使用dbf.setNamespaceAware(true)。另一方面,XSL和TransformerFactory充分使用名称空间,因此转换的结果文档使用名称空间限定 因此,在XSL转换旁边调用XPathExpression时,应该使用名称空间
XPath xPathProcessor = XPathFactory.newInstance().newXPath();
xPathProcessor.setNamespaceContext(new NamespaceContext() {
@Override
public String getNamespaceURI(String prefix) {
if(prefix.equals("t")) {
return "http://www.example.org/test";
} else {
return null;
}
}
@Override public String getPrefix(String namespaceURI) {
return null; // not used
}
@Override
public Iterator<?> getPrefixes(String namespaceURI) {
return null; // not used
}
});
XPathExpression xpathExpression = xPathProcessor.compile("/t:Message/t:Out/t:Personne/t:CodeCivilite");
System.out.println();
Node resultNode = (Node) xpathExpression.evaluate(node, XPathConstants.NODE);
XPath xPathProcessor=XPathFactory.newInstance().newXPath();
xPathProcessor.setNamespaceContext(新的NamespaceContext(){
@凌驾
公共字符串getNamespaceURI(字符串前缀){
if(前缀等于(“t”)){
返回“http://www.example.org/test";
}否则{
返回null;
}
}
@重写公共字符串getPrefix(字符串名称空间URI){
返回null;//未使用
}
@凌驾
公共迭代器getPrefixes(字符串名称空间URI){
返回null;//未使用
}
});
XPathExpression=xPathProcessor.compile(“/t:Message/t:Out/t:Personne/t:codecivite”);
System.out.println();
Node resultNode=(Node)xpathExpression.evaluate(Node,XPathConstants.Node);
引入一个临时文件,用默认的DocumentBuilderFactory(不知道名称空间)重新加载,使非限定XPATH表达式(没有名称空间)工作
希望这是清楚的:)除非使用dbf.setNamespaceAware(true),否则DocumentBuilderFactory默认不使用名称空间。另一方面,XSL和TransformerFactory充分使用名称空间,因此转换的结果文档使用名称空间限定 因此,在XSL转换旁边调用XPathExpression时,应该使用名称空间
XPath xPathProcessor = XPathFactory.newInstance().newXPath();
xPathProcessor.setNamespaceContext(new NamespaceContext() {
@Override
public String getNamespaceURI(String prefix) {
if(prefix.equals("t")) {
return "http://www.example.org/test";
} else {
return null;
}
}
@Override public String getPrefix(String namespaceURI) {
return null; // not used
}
@Override
public Iterator<?> getPrefixes(String namespaceURI) {
return null; // not used
}
});
XPathExpression xpathExpression = xPathProcessor.compile("/t:Message/t:Out/t:Personne/t:CodeCivilite");
System.out.println();
Node resultNode = (Node) xpathExpression.evaluate(node, XPathConstants.NODE);
XPath xPathProcessor=XPathFactory.newInstance().newXPath();
xPathProcessor.setNamespaceContext(新的NamespaceContext(){
@凌驾
公共字符串getNamespaceURI(字符串前缀){
if(前缀等于(“t”)){
返回“http://www.example.org/test";
}否则{
返回null;
}
}
@重写公共字符串getPrefix(字符串名称空间URI){
返回null;//未使用
}
@凌驾
公共迭代器getPrefixes(字符串名称空间URI){
返回null;//未使用
}
});
XPathExpression=xPathProcessor.compile(“/t:Message/t:Out/t:Personne/t:codecivite”);
System.out.println();
Node resultNode=(Node)xpathExpression.evaluate(Node,XPathConstants.Node);
引入一个临时文件,用默认的DocumentBuilderFactory(不知道名称空间)重新加载,使非限定XPATH表达式(没有名称空间)工作
希望这是清楚的:)使用3行存储和重新加载XML文档,它可以工作,但当我不这样做时(通过注释这3行),它就不再工作了。只需使用“/”的XpathExpression获取节点,打印并查看转换文档的根。也可以尝试“/”。另一件值得怀疑的事情是某种名称空间阻止了搜索。我找到了解决方案。这是一个名称空间问题。使用3行存储和重新加载XML文档,它可以工作,但当我不这样做时(通过注释这3行),它就不再工作了。只需使用“/”的XpathExpression获取节点,打印并查看转换文档的根。也可以尝试“/”。另一件值得怀疑的事情是某种名称空间阻止了搜索。我找到了解决方案。这是一个名称空间问题。