【问题标题】:XML/XSL evaluate() on a DocumentFragment?DocumentFragment 上的 XML/XSL 评估()?
【发布时间】:2021-03-30 15:29:15
【问题描述】:

无论出于何种原因,如果我输入源 XML,请评估它是否正确。但是,如果我使用样式表转换 XML 并且它是 DocumentFragment,它会转到警报(“否”)。有人知道会发生什么吗?也许需要在运行评估之前转换 DocumentFragment?但是为了什么?非常感谢。

doc_trans=xsltProcessor.transformToFragment(doc_xml_source, document);

//var resultDoc=doc_xnl_source;
var resultDoc=doc_trans;

//var path = "/catalog/cd/title"
path="/html/body/table//row";

if (resultDoc.evaluate) {
    alert("yes");
    var nodes = rDoc.evaluate(path, resultDoc, null, XPathResult.ANY_TYPE, null);
    var result = nodes.iterateNext();
    while (result) {
    alert(result.childNodes[0].nodeValue);
        txt += result.childNodes[0].nodeValue + "<br>";
        result = nodes.iterateNext();
    } 
    } else {
 alert("no");


var evaluator = new XPathEvaluator();

//DocumentFragment not a valid node type exception thrown here...

var resulty = evaluator.evaluate("//tbody/tr", resultDoc, null, 
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);

alert( resulty.snapshotLength);  


    }

【问题讨论】:

  • “成功了”。什么是“它”你用的是什么软件?这段代码在哪里运行?它是用什么语言编写的?
  • 你好。 Javascript,Chrome 浏览器。实际上是通过 w3 学校 api 工作的。使用他们的“cdcatalog.xml”;和“cdcatalog_client.xsl”。我能够完成转换,但想解析转换后的 DocumentFragment。 document.evaluate 似乎只接受 HTML 和 XML(旧的 MSXML 允许在转换后的 XML 上使用 selectNodes)。

标签: xml document.evaluate


【解决方案1】:

【讨论】:

  • 非常感谢。请在原始帖子中查看上面的编辑代码。我尝试将 XPathEvaluator 添加到“else”,但它仍然不喜欢 DocumentFragment 作为节点...“未捕获的 DOMException:无法在 'XPathEvaluator' 上执行 'evaluate':提供的节点是 '#document-fragment ',这不是有效的上下文节点类型。"
  • 我没有遇到这种限制,也没有看到它记录在案。您可以导航到子元素并从那里进行 XPath 评估。或者您可以安装 Saxon-JS 并获得 XPath 3.1 的好处...
【解决方案2】:

我也尝试过将 DocumentFragment (resultDoc) 转换为 HTML 元素 (zz)...

var zz=document.createElement("div2");
zz.appendChild(resultDoc);

var evaluator = new XPathEvaluator();

var resulty = evaluator.evaluate("//tbody/tr", zz, null, 
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);

产生异常...“TypeError: Cannot read property 'snapshotLength' of undefined”

【讨论】:

    【解决方案3】:

    DocumentFragment 与 NodeList 共享大部分方法,因此 querySelector 和 querySelectorAll、firstChild 等方法与生成的 DocumentFragment 共享。

    我想在转换后的文档(A DocumentFragment)中找到行数,所以使用 querySelector 而不是评估...

    var allDivs = resultDoc.querySelectorAll('tr');
    
    alert(allDivs.length);
    

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 2021-10-03
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      相关资源
      最近更新 更多