デフォルトのブラウザのXPath実装がEXSLTをサポートしているとは思われません。 EXSLTページに記載されているjavascriptのサポートは、in-browser.javascriptを使用してexslt関数を独自に実装する方法についての可能性があります。ここにはone example I was able to find very quicklyがあります。
例えば、Firefoxでは、Saxon-B as an extension to run XSLT2.0とSaxon-B has built-in support for exslt (unlike Saxon-HE), though you will likely be better off just using XSLT/XPath 2.0 featuresを使用できます。たとえば、regular expression syntaxがあります。しかし、Mozilla Saxon-Bの拡張機能に頼っているのは、Chromeや他のブラウザの場合に役立つものではありません。
私は、XPathでEXSLT拡張機能を使用するためのクロスブラウザソリューションを見つけることはできないと思います。 DOM Level 3 XPathのconformance sectionにはXPath 1.0のサポートが必要であり、EXSLTについては言及していません。 INVALID_EXPRESSION_ERR
がスローされると言われている:Firefoxは彼らのDOMレベル3 XPathの実装のEXSLTのサポートを開くため
if the expression has a syntax error or otherwise is not a legal expression according to the rules of the specific XPathEvaluator or contains specialized extension functions or variables not supported by this implementation.
は最後に、ここにopen bugzilla ticketです。それは2007年以来、新しい地位にそこに座っているようだ。チケットはそれを言う:
Currently Mozilla gives an exception "The expression is not a legal expression." even if a namespace resolver correctly resolving the EXSLT prefixes to the corresponding URLs is passed in
。ここにはtest caseがあります。
-
あなたがのために正規表現を使用したいまさに、求めて私を気にしない場合は? standard XPath string functionsの組み合わせで手伝ってもらえるのでしょうか?
- (あなたがあなたの質問に更新して求めているように)あなたがXSLTを経由してXPathのランナーを構築することができますが、、それはソースドキュメントからノードを返しません
UPDATE、それは意志まったく同じように見える新しいノードを返します。 XSLTは新しい結果ツリードキュメントを生成し、元のノードへの参照を返す方法はないと思います。
Mozilla(とChrome)の両方で、外部ソースから読み込まれたXMLドキュメントだけでなく、表示されているドキュメントのDOMエレメントにも、support XSLTがあります。XSLTProcessor
documentationには、tranformToFragment()
の名前が記載されています。たとえば、will only produce HTML DOM objects if the owner document is itself an HTMLDocument, or if the output method of the stylesheet is HTML
です。
ここで私はあなたのIDEをテストする単純なXPathのランナーです:
1)まず、あなたがで動作するようにXSLTテンプレートが必要になります。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:regexp="http://exslt.org/regular-expressions"
extension-element-prefixes="regexp">
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
私はdocument.implementation.createDocument
APIを使ってJavaScriptでそれを構築し始めたが、ちょうどそれをロードするために容易になるだろう考え出しました。 FFはまだdocument.load
をサポートしていますが、ChromeではXHRを使って読み込むことしかできません。ローカルディスクからXHRでファイルをロードする場合は、--allow-file-access-from-files
でChromeを起動する必要があります。
2)私たちは、テンプレートをロードした後、我々は我々が必要とするXPathの実行にxsl:copy-of
命令のselect
属性の値を変更する必要があります:
function runXPath(xpath) {
var processor = new XSLTProcessor();
var xsltns = 'http://www.w3.org/1999/XSL/Transform';
var xmlhttp = new window.XMLHttpRequest();
xmlhttp.open("GET", "xpathrunner.xslt", false);
xmlhttp.send(null);
var transform = xmlhttp.responseXML.documentElement;
var copyof = transform.getElementsByTagNameNS(xsltns, 'copy-of')[0];
copyof.setAttribute('select', xpath);
processor.importStylesheet(transform);
var body = document.getElementById('body'); // I gave my <body> an id attribute
return processor.transformToFragment(body, document);
}
あなたは今のようなもので、それを実行することができました:
var nodes = runXPath('//div[@id]');
console.log(nodes.hasChildNodes());
if (nodes.firstChild) {
console.log(nodes.firstChild.localName);
}
それはその//div[@id]
(および//div[@not-there]
を見つけることができない)のような「通常の」のXPath のための素晴らしい作品が、私はちょうどそれがregexp:test
を実行するために取得することはできません拡張機能。 //div[regexp:test(string(@id), "a")]
ではエラーは発生せず、ただ空のセットが返されます。
Mozillaのマニュアルにはtheir XSLT processor support EXSLTがあります。とにかく、彼らは舞台裏でlibxml/libxsltを使用していると思います。つまり、私はそれをMozillaでも動作させることができませんでした。
希望します。
jQuery regexpと一緒に逃げる可能性はありますか?あなたのXPathビルダー・ユーティリティーに役立つ可能性は低いですが、HTMLノードでregexpを実行する方法はまだありません。
SaxonCEの使用を検討しましたか?これはブラウザでXSLT 2.0を実行するためのサポートを提供しています(Chromeを含む主要5つのブラウザすべてで正常に動作します)。 –
彼らはXSLT20Processorに相当するjavascript XPath20Evaluatorを公開していると素晴らしいでしょう。残念ながら、彼らはまだそのオプションを提供していません。しかし、チップのおかげで。それはそこにあることを知って良いです。 – underrun
「それら」を待つ必要はありません。 SaxonCEのライセンスを取得して使用してください。 –