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 "&amp;#19

这里是我遇到的问题(查看下面的文件以获得更好的图片):

如何在上面添加更多“过滤器”?例如:
[year>1962&&author=Dan Larson]
我知道这不是正确的语法,因为它不起作用,所以我该怎么做

XML文件:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="books.xsl"?>
<!DOCTYPE books [
<!ENTITY Aring  "&amp;#197;" >
<!ENTITY aring  "&amp;#229;" >
<!ENTITY agrave "&amp;#224;" >
<!ENTITY aacute "&amp;#225;" >
<!ENTITY auml   "&amp;#228;" >
<!ENTITY ccedil "&amp;#231;" >
<!ENTITY eacute "&amp;#233;" >
<!ENTITY egrave "&amp;#232;" >
<!ENTITY iacute "&amp;#237;" >
<!ENTITY iuml   "&amp;#239;" >
<!ENTITY oacute "&amp;#243;" >
<!ENTITY ocirc  "&amp;#244;" >
<!ENTITY oslash "&amp;#248;" >
<!ENTITY Ouml   "&amp;#214;" >
<!ENTITY ouml   "&amp;#246;" >
<!ENTITY uuml   "&amp;#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(样式表));
}
}

搜寻 作者: 标题: 年份: 作者人数:

排序 作者 标题 年 页数

要根据用户选择的值动态设置值,请执行以下操作:


  • 给输入一个id(例如,
    太好了!现在你可以看到,我已经编辑了我的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);