Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.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
使用xpath从xml文件获取一些信息的xslt在JavaScript中不起作用_Javascript_Xml_Xslt_Xpath - Fatal编程技术网

使用xpath从xml文件获取一些信息的xslt在JavaScript中不起作用

使用xpath从xml文件获取一些信息的xslt在JavaScript中不起作用,javascript,xml,xslt,xpath,Javascript,Xml,Xslt,Xpath,我有一个xml文件。它是用来被xslt处理器转换的。特定的模板已经准备好了,但是它使用了来自另外两个xml文件的一些信息。所有信息都用于产生正确的输出 当我用浏览器打开主xml文件时,它工作正常。问题是:结果只是网站的一个片段,它是一个HTML元素,可以作为子元素追加。这就是为什么我想在JavaScript函数中使用xslt处理器转换xml。不幸的是,结果是成功了一半。xpath表达式导入的这两个xml文件中不需要额外信息的所有内容都得到了很好的转换。其他人很快就会缺席发言 JavaScript

我有一个xml文件。它是用来被xslt处理器转换的。特定的模板已经准备好了,但是它使用了来自另外两个xml文件的一些信息。所有信息都用于产生正确的输出

当我用浏览器打开主xml文件时,它工作正常。问题是:结果只是网站的一个片段,它是一个HTML元素,可以作为子元素追加。这就是为什么我想在JavaScript函数中使用xslt处理器转换xml。不幸的是,结果是成功了一半。xpath表达式导入的这两个xml文件中不需要额外信息的所有内容都得到了很好的转换。其他人很快就会缺席发言

JavaScript:

var xhttp = new XMLHttpRequest()
var xsltProcessor = new XSLTProcessor()
xhttp.open("GET", "contentTemplate.xsl", false)
xhttp.send()
xsltProcessor.importStylesheet(xhttp.responseXML)

function buildElement(what) {
var xmlDoc = document.implementation.createDocument("", "root", null)
xmlDoc.documentElement.appendChild(xmlDoc.createElement(what))

var resultDocumentFragment = xsltProcessor.transformToFragment(xmlDoc, document)
return resultDocumentFragment
}
function talkToServer(address, synch, func) {
func = typeof(func) != 'undefined' ? func : null
xhttp.open(method, address, synch)
xhttp.onreadystatechange = func
xhttp.send()
}

function getXPath(query) {
return document.evaluate(query, xhttp.responseXML, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null)
}

function buildElement(what) {
var xmlDoc = document.implementation.createDocument("", "root", null)
xmlDoc.documentElement.appendChild(xmlDoc.createElement(what))

switch(what) {
case "windowElement":
talkToServer("tagAvailableToAdd.xml", false)
var additionalInfo = getXPath("/root/tag")
var aim = xmlDoc.documentElement.getElementsByTagName("windowElement")[0]
for(i=0;i<additionalInfo.snapshotLength;i++)
    aim.appendChild(additionalInfo.snapshotItem(i).cloneNode(true))

talkToServer("cssTemplates.xml", false)
additionalInfo = getXPath("/root/*")
aim.appendChild(xmlDoc.createElement("css"));
aim = aim.getElementsByTagName("css")[0]
for(i=0;i<additionalInfo.snapshotLength;i++)
    aim.appendChild(additionalInfo.snapshotItem(i).cloneNode(true))
break;
}
var resultDocumentFragment = xsltProcessor.transformToFragment(xmlDoc, document)
return resultDocumentFragment
}
xslt:

有很多东西,我只粘贴xslt和xpath表达式

<xsl:variable name="extInfo" select="document('tagAvailableToAdd.xml')/root"/>
<xsl:for-each select="$extInfo/tag">
 <option>
  <xsl:attribute name="value"><xsl:value-of select="tagName"/></xsl:attribute>
  <xsl:value-of select="description"/>
 </option>
</xsl:for-each>
<xsl:variable name="extInfo" select="document('tagAvailableToAdd.xml')/root"/>

<xsl:for-each select="$extInfo/tag"> 
 <option> 
  <xsl:attribute name="value"><xsl:value-of
这是不存在的。就像没有传递任何信息一样

编辑:

它在firefox中工作,在chrome中不工作。我需要改进它。事实上,我不知道怎么做

xslt:

有很多东西,我只是贴上而已 带xpath表达式的xslt

<xsl:variable name="extInfo" select="document('tagAvailableToAdd.xml')/root"/>
<xsl:for-each select="$extInfo/tag">
 <option>
  <xsl:attribute name="value"><xsl:value-of select="tagName"/></xsl:attribute>
  <xsl:value-of select="description"/>
 </option>
</xsl:for-each>
<xsl:variable name="extInfo" select="document('tagAvailableToAdd.xml')/root"/>

<xsl:for-each select="$extInfo/tag"> 
 <option> 
  <xsl:attribute name="value"><xsl:value-of
选择=标记名/>

这是不存在的。就像没有 提供了信息

这种行为的一些可能原因:

XML文件的URI不正确。这是一个相对URI,此特定URI将帮助XSLT处理器查找名为“tagAvailableToAdd.xml”的文件,该文件位于样式表的基本URI处。但是,在本例中,样式表是动态获取的,这意味着它没有任何基本uri。这是问题最可能的原因

Javascript没有访问本地文件系统中文件的权限

XSLT处理器默认不允许使用文档函数

文件中包含的文本不是格式良好的XML文档


XML文件的顶部元素未命名为root


解决方案:指定一个绝对URI作为document函数的参数。

我以为我已经解决了这个问题,但是firefox出现了一个问题

尽管如此,我还是关心我的本地浏览器chrome,这就是为什么我很高兴我能在这个程序中使用它。这就是我在JavaScript中实现的更改:

var xhttp = new XMLHttpRequest()
var xsltProcessor = new XSLTProcessor()
xhttp.open("GET", "contentTemplate.xsl", false)
xhttp.send()
xsltProcessor.importStylesheet(xhttp.responseXML)

function buildElement(what) {
var xmlDoc = document.implementation.createDocument("", "root", null)
xmlDoc.documentElement.appendChild(xmlDoc.createElement(what))

var resultDocumentFragment = xsltProcessor.transformToFragment(xmlDoc, document)
return resultDocumentFragment
}
function talkToServer(address, synch, func) {
func = typeof(func) != 'undefined' ? func : null
xhttp.open(method, address, synch)
xhttp.onreadystatechange = func
xhttp.send()
}

function getXPath(query) {
return document.evaluate(query, xhttp.responseXML, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null)
}

function buildElement(what) {
var xmlDoc = document.implementation.createDocument("", "root", null)
xmlDoc.documentElement.appendChild(xmlDoc.createElement(what))

switch(what) {
case "windowElement":
talkToServer("tagAvailableToAdd.xml", false)
var additionalInfo = getXPath("/root/tag")
var aim = xmlDoc.documentElement.getElementsByTagName("windowElement")[0]
for(i=0;i<additionalInfo.snapshotLength;i++)
    aim.appendChild(additionalInfo.snapshotItem(i).cloneNode(true))

talkToServer("cssTemplates.xml", false)
additionalInfo = getXPath("/root/*")
aim.appendChild(xmlDoc.createElement("css"));
aim = aim.getElementsByTagName("css")[0]
for(i=0;i<additionalInfo.snapshotLength;i++)
    aim.appendChild(additionalInfo.snapshotItem(i).cloneNode(true))
break;
}
var resultDocumentFragment = xsltProcessor.transformToFragment(xmlDoc, document)
return resultDocumentFragment
}
在xslt中,我现在有了所有信息,因此不需要导入任何外部信息

主要功能是buildElement。我相信每个人都能看到它的作用。它的目的是提供我可以粘贴到HTML文档的东西

在chrome中,它可以工作。在firefox中说:节点不能用于创建它的文档以外的文档中代码:4,并指向getXPath函数中的return语句。我不知道如何修复它,但谁在乎呢,它只是firefox,我知道它很愚蠢。在IE中,它很糟糕,因为xhttp是XHTPrequest对象,但我相信,当我提供ActiveX时,它应该满足我的需要


如果您觉得可以在firefix问题上帮助我,请写一篇评论。

xhttp.responseXML包含哪些内容?好问题,+1。有关此问题的可能原因列表,请参见我的答案。xhttp.responseXML保存从服务器获取的样式表。样式表知道如何转换表示可在浏览器中查看的页面的xml文件。我用它来建立HTML节点,我可以把它放到网站上。顺便说一句,它让我能够定义自己的标记,例如,XML文件的顶部元素没有命名为root——我已经检查过了:有root元素;没关系。文件中包含的文本不是一个格式良好的XML文档——为什么直接输入时它会工作?我想这不是重点。XSLT处理器默认不允许使用document函数-如何检查它?现在这并不明显。Javascript没有权限访问本地文件系统中的文件-不会引发错误-不知道是否发生了错误。XML文件的URI不正确。URI与xsl文件在服务器上的位置有关。@lord.didger:您可能应该使用try/catch或analyze返回代码。至于启用文档功能,您需要阅读浏览器使用的XSLT处理器的文档。我使用try/catch分析var resultDocumentFragment=xsltProcessor.transformToFragmentxmlDoc,document-它使用样式表,在我看来失败了。没有发现错误,它重现了我所看到的。我的天啊,它在firefox中工作——我之前在chrome上测试过它。现在我必须改变这个问题://lord.didger:那么,您使用的浏览器是什么?@lord.didger:第一个原因是您出现问题的真正原因。我编辑了我的答案,提供了更多信息和解决方案。好的,我已经找到了解决方案。return语句现在是:return xhtp.responseXML.evaluatequery、xhtp.responseXML、null、XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE、null如果只是将外部文档作为参数传递给Transformation,将不会更容易、更交叉吗?你是什么意思? 我想这正是我正在做的。我在这里将xml文件作为参数传递给转换:xsltProcessor.transformToFragmentxmlDoc,document。若有办法将更多的xml文件传递给转换过程,我肯定会这样做。