Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.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 XSL转换,然后在结果节点上使用XPath表达式_Java_Xml_Xslt_Xpath - Fatal编程技术网

Java XSL转换,然后在结果节点上使用XPath表达式

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

我正在对输入XML进行XSL转换,然后需要在生成的文档上使用XPath提取一些值。但在使用XSL结果节点时,XPath表达式可能总是返回null。 但是如果我将XSL结果文档存储在一个文件中,然后重新加载它。XPath表达式返回相应的节点

这是我的代码(为了便于理解,实用功能已被删除):

只需注释或删除“//Store”下面的3行,然后重新加载文件,“测试将不再通过”


我完全卡住了,欢迎任何帮助。

我想知道解析文件是否会让您的树变短。尝试使用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获取节点,打印并查看转换文档的根。也可以尝试“/”。另一件值得怀疑的事情是某种名称空间阻止了搜索。我找到了解决方案。这是一个名称空间问题。