Javascript 用于基于多个值解析XML的XPath表达式?
这里是我遇到的问题(查看下面的文件以获得更好的图片): 如何在上面添加更多“过滤器”?例如:Javascript 用于基于多个值解析XML的XPath表达式?,javascript,html,xml,xslt,xpath,Javascript,Html,Xml,Xslt,Xpath,这里是我遇到的问题(查看下面的文件以获得更好的图片): 如何在上面添加更多“过滤器”?例如:[year>1962&&author=Dan Larson]我知道这不是正确的语法,因为它不起作用,所以我该怎么做 XML文件: <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="books.xsl"?> <!DOCTYPE books [ <!ENTITY Aring "&#19
[year>1962&&author=Dan Larson]
我知道这不是正确的语法,因为它不起作用,所以我该怎么做
XML文件:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="books.xsl"?>
<!DOCTYPE books [
<!ENTITY Aring "&#197;" >
<!ENTITY aring "&#229;" >
<!ENTITY agrave "&#224;" >
<!ENTITY aacute "&#225;" >
<!ENTITY auml "&#228;" >
<!ENTITY ccedil "&#231;" >
<!ENTITY eacute "&#233;" >
<!ENTITY egrave "&#232;" >
<!ENTITY iacute "&#237;" >
<!ENTITY iuml "&#239;" >
<!ENTITY oacute "&#243;" >
<!ENTITY ocirc "&#244;" >
<!ENTITY oslash "&#248;" >
<!ENTITY Ouml "&#214;" >
<!ENTITY ouml "&#246;" >
<!ENTITY uuml "&#252;" >
]>
<books>
<scifi key="DanlarsC83">
<shelfcode>scif/all/83</shelfcode>
<author>Dan Larson</author>,
<author>James Roberts</author>,
<author>Chris Rupert</author>,
<title>The Game</title>,
<pages>126-212</pages>,
<year>1965</year>,
<booktitle>SCI</booktitle>,
</scifi>
<scifi key="RobDwightS45">
<shelfcode>scif/all/45</shelfcode>
<author>Dan Larson</author>,
<author>Christine Dwight</author>,
<title>Hopes</title>,
<pages>113-242</pages>,
<year>1973</year>,
<booktitle>SCI</booktitle>,
</scifi>
<scifi key="MarkJohnsC52">
<shelfcode>scif/all/52</shelfcode>
<author>Dan Larson</author>,
<title>Incognitum</title>,
<pages>131-420</pages>,
<year>1949</year>,
<booktitle>SCI</booktitle>,
</scifi>
</books>
]>
scif/all/83
丹·拉森,
詹姆斯·罗伯茨,
克里斯·鲁珀特,
比赛,
126-212,
1965,
SCI,
scif/all/45
丹·拉森,
克里斯汀·德怀特,
希望,,
113-242,
1973,
SCI,
scif/all/52
丹·拉森,
隐姓埋名,
131-420,
1949,
SCI,
XSL文件:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<center><h1>TOM's Sci-Fi</h1>
<table border="1">
<tr>
<th>Title</th>
<th>Authors</th>
<th>Pages</th>
<th>Year</th>
</tr>
<xsl:for-each select="books/scifi">
<xsl:sort select="year"/>
<tr>
<td><center><xsl:value-of select="title"/></center></td>
<td>
<xsl:for-each select="author">
<p><xsl:value-of select="."/></p>
</xsl:for-each>
</td>
<td><xsl:value-of select="pages"/></td>
<td><xsl:value-of select="year"/></td>
</tr>
</xsl:for-each>
</table>
</center>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
汤姆的科幻小说
标题
作者
页
年
HTML文件:
<html>
<script type="text/javascript">
var moz = (typeof document.implementation.createDocument != 'undefined');
var ie = (typeof window.ActiveXObject != 'undefined');
function loadXML(file)
{
var xmlDoc;
if (moz)
xmlDoc = document.implementation.createDocument("", "", null);
else if (ie)
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.validateOnParse=false;
xmlDoc.load(file);
return xmlDoc;
}
</script>
<body id="target4">
<script type="text/javascript">
function filterTable(f)
{
var xmlDoc = loadXML("books.xml");
var stylesheet = loadXML("books.xsl");
var moz = (typeof document.implementation.createDocument != 'undefined');
var ie = (typeof window.ActiveXObject != 'undefined');
if (moz)
{
var nsResolver = stylesheet.createNSResolver( stylesheet.ownerDocument == null ? stylesheet.documentElement : stylesheet.ownerDocument.documentElement);
var value = stylesheet.evaluate("//xsl:template[@match='/']//xsl:for-each", stylesheet, nsResolver, XPathResult.ANY_UNORDERED_NODE_TYPE, null);
var author = document.getElementById("inauthor").value;
var title = document.getElementById("intitle").value;
var year = document.getElementById("inyear").value;
var filter = "";
if (author != "")
{
filter= filter + "author='" + author.substr(1) + "'";
}
if (title != "")
{
if (filter != "") filter = filter + " and ";
filter = filter + "title='" + title.substr(1) + "'";
}
if (year != "")
{
if (filter != "") filter = filter + " and ";
filter = filter + "year" + year.substr(0) + year.substr(1);
}
value.singleNodeValue.setAttribute("select", "books/scifi[filter]");
var proc = new XSLTProcessor();
proc.importStylesheet(stylesheet);
var resultFragment = proc.transformToFragment(xmlDoc, document);
document.getElementById("target4").appendChild(resultFragment);
}
else if (ie)
{
var value = stylesheet.selectSingleNode("//xsl:template[@match='/']//xsl:for-each");
value.setAttribute("select", "books/scifi[filter]");
document.write(xmlDoc.transformNode(stylesheet));
}
}
<center>
<table border="1" cellpadding="8">
<tr><td>
</br>
<form>
<center>
<b> search by </b>
Author(s): <input type="text" name="authors" />
Title: <input type="text" name="title" />
Year: <input type="text" name="year" />
No of Authors: <input type="text" name="numauth" />
</br></br>
<b> sort by</b>
<input type="radio" name="sorter" value="author" />author
<input type="radio" name="sorter" value="title" />title
<input type="radio" name="sorter" value="year" />year
<input type="radio" name="sorter" value="pages" />pages</br></br>
<input type="button" value="Display" onClick="filterTable(this.form)"/>
</center>
</form>
</td></tr>
</table>
</center>
</body>
</html>
var moz=(typeof document.implementation.createDocument!=“未定义”);
变量ie=(typeof window.ActiveXObject!=“未定义”);
函数loadXML(文件)
{
var-xmlDoc;
if(moz)
xmlDoc=document.implementation.createDocument(“,”,null);
否则,如果(即)
xmlDoc=新的ActiveXObject(“Microsoft.XMLDOM”);
xmlDoc.async=false;
xmlDoc.validateOnParse=false;
加载(文件);
返回xmlDoc;
}
函数过滤器表(f)
{
var xmlDoc=loadXML(“books.xml”);
var stylesheet=loadXML(“books.xsl”);
var moz=(typeof document.implementation.createDocument!=“未定义”);
变量ie=(typeof window.ActiveXObject!=“未定义”);
if(moz)
{
var nsResolver=stylesheet.createNSResolver(stylesheet.ownerDocument==null?stylesheet.documentElement:stylesheet.ownerDocument.documentElement);
var value=stylesheet.evaluate(“//xsl:template[@match='/']///xsl:for each”,样式表,nsResolver,XPathResult.ANY_UNORDERED_NODE_TYPE,null);
var author=document.getElementById(“inauthor”).value;
var title=document.getElementById(“intitle”).value;
var year=document.getElementById(“inyear”).value;
var过滤器=”;
如果(作者!=“”)
{
filter=filter+“author=”+“author.substr(1)+“”;
}
如果(标题!=“”)
{
如果(过滤器!=“”)过滤器=过滤器+“和”;
filter=filter+“title=”+“title.substr(1)+“”;
}
如果(年!=“”)
{
如果(过滤器!=“”)过滤器=过滤器+“和”;
过滤器=过滤器+“年”+年.substr(0)+年.substr(1);
}
value.singleNodeValue.setAttribute(“选择”、“书籍/scifi[filter]”);
var proc=new XSLTProcessor();
过程导入样式表(样式表);
var resultFragment=proc.transformToFragment(xmlDoc,文档);
document.getElementById(“target4”).appendChild(resultFragment);
}
否则,如果(即)
{
var value=stylesheet.selectSingleNode(“//xsl:template[@match='/']///xsl:for each”);
value.setAttribute(“选择”、“书籍/科幻[过滤器]”);
write(xmlDoc.transformNode(样式表));
}
}
搜寻
作者:
标题:
年份:
作者人数:
排序
作者
标题
年
页数
要根据用户选择的值动态设置值,请执行以下操作:
太好了!现在你可以看到,我已经编辑了我的HTML文件,并将解析脚本转换成一个函数,每当用户单击显示按钮时都会调用该函数。我如何用用户在相关字段中输入的内容替换year>1962&author='Dan Larson'。再次感谢你的帮助!嗯……我忘了提到'=','>','value.setAttribute(“选择”,“书籍/科幻[+filter+]))
为什么我们需要在筛选前后加上加号,筛选中不包括所有内容吗?另外,如果用户将所有字段留空,我希望返回整个表。因此var filter=
应该设置为在这种情况下是什么?关于我之前的评论:if(authors!=“”)filter+=“author=”+author+“”;
实际上会用author='=Dan Larson'
替换filter
,这是没有意义的:(加号将两个字符串连接在一起。它不是值。setAttribute(“选择”,“图书/科幻[+filter+]”;
,它是值。setAttribute(“选择”,“图书/科幻[+filter+]”);
<html>
<script type="text/javascript">
var moz = (typeof document.implementation.createDocument != 'undefined');
var ie = (typeof window.ActiveXObject != 'undefined');
function loadXML(file)
{
var xmlDoc;
if (moz)
xmlDoc = document.implementation.createDocument("", "", null);
else if (ie)
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.validateOnParse=false;
xmlDoc.load(file);
return xmlDoc;
}
</script>
<body id="target4">
<script type="text/javascript">
function filterTable(f)
{
var xmlDoc = loadXML("books.xml");
var stylesheet = loadXML("books.xsl");
var moz = (typeof document.implementation.createDocument != 'undefined');
var ie = (typeof window.ActiveXObject != 'undefined');
if (moz)
{
var nsResolver = stylesheet.createNSResolver( stylesheet.ownerDocument == null ? stylesheet.documentElement : stylesheet.ownerDocument.documentElement);
var value = stylesheet.evaluate("//xsl:template[@match='/']//xsl:for-each", stylesheet, nsResolver, XPathResult.ANY_UNORDERED_NODE_TYPE, null);
var author = document.getElementById("inauthor").value;
var title = document.getElementById("intitle").value;
var year = document.getElementById("inyear").value;
var filter = "";
if (author != "")
{
filter= filter + "author='" + author.substr(1) + "'";
}
if (title != "")
{
if (filter != "") filter = filter + " and ";
filter = filter + "title='" + title.substr(1) + "'";
}
if (year != "")
{
if (filter != "") filter = filter + " and ";
filter = filter + "year" + year.substr(0) + year.substr(1);
}
value.singleNodeValue.setAttribute("select", "books/scifi[filter]");
var proc = new XSLTProcessor();
proc.importStylesheet(stylesheet);
var resultFragment = proc.transformToFragment(xmlDoc, document);
document.getElementById("target4").appendChild(resultFragment);
}
else if (ie)
{
var value = stylesheet.selectSingleNode("//xsl:template[@match='/']//xsl:for-each");
value.setAttribute("select", "books/scifi[filter]");
document.write(xmlDoc.transformNode(stylesheet));
}
}
<center>
<table border="1" cellpadding="8">
<tr><td>
</br>
<form>
<center>
<b> search by </b>
Author(s): <input type="text" name="authors" />
Title: <input type="text" name="title" />
Year: <input type="text" name="year" />
No of Authors: <input type="text" name="numauth" />
</br></br>
<b> sort by</b>
<input type="radio" name="sorter" value="author" />author
<input type="radio" name="sorter" value="title" />title
<input type="radio" name="sorter" value="year" />year
<input type="radio" name="sorter" value="pages" />pages</br></br>
<input type="button" value="Display" onClick="filterTable(this.form)"/>
</center>
</form>
</td></tr>
</table>
</center>
</body>
</html>
[year>1962 and author='Dan Larson']
var author = document.getElementById("author").value;
var title = document.getElementById("title").value;
var year = document.getElementById("year").value;
var filter = "";
if (authors != "") filter += "author='" + author + "'";
if (title != "") {
if (filter != "") filter += " and ";
filter += "title='" + title + "'";
}
if (year != "") {
if (filter != "") filter += " and ";
filter += "year>" + year;
}
if (filter != "") filter = "[" + filter + "]";
value.setAttribute("select", "books/scifi" + filter);