1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

XPathでFizzBuzz

Posted at

皆さんはXPathでFizzBuzzが書けることをご存じですか?

ほとんどの方はXPathと聞くとXMLやHTMLから特定の文字列などを取り出すもの、と認識しているはずです。
それも間違いではないのですが、それしかできないと思うのは完全な間違いです。
実はXPathでもプログラミング言語でよく行われる、 FizzBuzzができる のです。
まずはこのXPathコードを見てください。

let $data := 1 to 100
return 
for $i in $data
return
if(($i mod 3 = 0) and ($i mod 5 eq 0))
then "fizzbuzz"
else if($i mod 3 = 0) then "fizz"
else if($i mod 5 = 0) then "buzz"
else $i

「え?これがXPath?」と、ほとんどの方は驚くでしょう。
残念なことに、よく知られているXPathはXPath1.0で、これはFizzBuzzはできません。

しかし、実は現時点で最新のXPathは 3.1 です。
そう、XPathにも バージョンがある のです。

上記コードの実行結果はこちらのコンソールから見れます。

それでは、どうやって最新のXPathを実行するか、まずはXHTMLを見てみましょう。

<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8"/>
<title>XPathでFizzBuzz</title>
<script src="../../components/lib/SaxonJS2.js"></script>
<script src="fizzbuzz.js"></script>
</head>
<body>
<h1>XPathでFizzBuzz</h1>
<p>XPathでFizzBuzzを実行します。開発者パネルのコンソールを見てください。</p>
</body>
</html>

まず、XPath3.1をウェブで実行するにはSaxonJSが必要です。
Saxonicaのウェブサイトからダウンロードします。

次にJavaScriptです。

const xpath = `
let $data := 1 to 100
return 
for $i in $data
return
if(($i mod 3 = 0) and ($i mod 5 = 0))
then "fizzbuzz"
else if($i mod 3 = 0) then "fizz"
else if($i mod 5 = 0) then "buzz"
else $i
`;

window.addEventListener("load", function() {
	console.log(xpath);
	dataset = SaxonJS.XPath.evaluate(xpath, null);
	console.log(dataset);
});

先ほどのXPathをただ実行しているだけです。SaxonJS.XPath.evaluate(xpath, null)がSaxonJSでXPathを実行するための基本となります。

いかがでしたか。
XPathは一般のイメージと違って実質プログラミング言語です。
なので、かなり強力な処理ができます。
ぜひとも、どしどし使っていただきたいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?