xsl:template match=”//[要素]” と match=”[要素]” の違い

投稿者: Anonymous <xsl:template match=”//p” > と <xsl:template match=”p” > の違いが良くわかりません。 わかりやすくご解説可能な方がいらっしゃいましたら宜しくお願いいたします。 例えば以下のような stylesheet の場合、<xsl:template match=”//p” > が優先して処理されます。 <!– xml –> <?xml version=”1.0″ encoding=”UTF-8″?> <root> <p p=”1″> <p p=”2″> <p p=”3″/> </p> </p> </root> <!– stylesheet –> <?xml version=”1.0″ encoding=”UTF-8″?> <xsl:stylesheet xmlns:xsl=”http://www.w3.org/1999/XSL/Transform” xmlns:xs=”http://www.w3.org/2001/XMLSchema” exclude-result-prefixes=”xs” version=”2.0″> <xsl:template match=”//p” > <xsl:copy-of select=”.”></xsl:copy-of> <xsl:value-of select=”‘//p'”/> </xsl:template> <xsl:template match=”p” >…(Continue Reading)

XPath 最初に見つかったノードのみを処理する

投稿者: Anonymous 以下のような xsl の場合,最初に見つかった要素のみを処理したい場合に XPath はどのような式になりますでしょうか? 例えば xsl:copy-of select=”$v//p/@*” とすると,配下すべての p 要素の属性がコピーされてしまいます。最初の要素のみを処理したいのです。 <?xml version=”1.0″ encoding=”UTF-8″?> <xsl:stylesheet xmlns:xsl=”http://www.w3.org/1999/XSL/Transform” xmlns:xs=”http://www.w3.org/2001/XMLSchema” exclude-result-prefixes=”xs” version=”2.0″> <xsl:variable name=”v”> <a> <p att1=”a” att2=”b” > <p att3=”c”> <p > </p> </p> </p> </a> </xsl:variable> <xsl:template match=”/”> <p> <xsl:copy-of select=”????”/> </p> </xsl:template> </xsl:stylesheet> 期待する結果 <?xml version=”1.0″ encoding=”UTF-8″?><p att1=”a” att2=”b” /> 宜しくお願い致します。 解決 $v/descendant::p[1]/@*。…(Continue Reading)

パターンのnode()とノードテストのnode()の違い

投稿者: Anonymous 初歩的なことで教えてください.仕様と言われればそれまでですが、表題の両者はなぜ違うのでしょう? パターンのnode() https://www.w3.org/TR/xslt-30/#patterns node() matches any node other than an attribute node, namespace node, or document node. ノードテストのnode() https://www.w3.org/TR/xpath-31/#doc-xpath31-NodeTest node() matches any node. これは次のようなスタイルシートで確認できます. [入力XML] <?xml version=”1.0″ encoding=”UTF-8″?> <doc xmlns:my-prefix=”http://my.com/namespace”> <title>Document title</title> <chapter toc=”yes”> <!– これはコメントです–> <?pi これは処理命令です. ?> <p>The quick brown fox jumps over the lazy dog</p> </chapter> <my-prefix:h1>これは名前空間”http://my.com/namespace”に属した要素のテキストです</my-prefix:h1> </doc> [スタイルシート] <?xml…(Continue Reading)

XSLT 3.0で無名関数での再帰はどうのように記述するのでしょうか?

投稿者: Anonymous XSLT 2.0はxsl:functionで2乗を求める関数を次のように書くことができます. <?xml version=”1.0″ encoding=”UTF-8″?> <xsl:stylesheet xmlns:xsl=”http://www.w3.org/1999/XSL/Transform” xmlns:xs=”http://www.w3.org/2001/XMLSchema” xmlns:ahf=”urn:ahf” exclude-result-prefixes=”xs” version=”2.0″> <xsl:function name=”ahf:powerOf2″ as=”xs:integer”> <xsl:param name=”prmX” as=”xs:integer”/> <xsl:sequence select=”$prmX * $prmX”/> </xsl:function> <xsl:template match=”/”> <xsl:variable name=”x” as=”xs:integer” select=”3″/> <!– ここでxの2乗を求め、xの値、結果の値をxsl:messageで表示します–> <xsl:message select=”‘x=’, $x, ‘ xの2乗=’, ahf:powerOf2($x)”/> </xsl:template> </xsl:stylesheet> これはXSLT 3.0ではインラインの無名関数を使って次のように書くことができます. <?xml version=”1.0″ encoding=”UTF-8″?> <xsl:stylesheet xmlns:xsl=”http://www.w3.org/1999/XSL/Transform” xmlns:xs=”http://www.w3.org/2001/XMLSchema” xmlns:ahf=”urn:ahf” exclude-result-prefixes=”xs” version=”3.0″> <xsl:variable name=”powerOf2″ as=”function(*)” select=”function($x…(Continue Reading)

element()* にドキュメントオーダーを強制する

投稿者: Anonymous 以下は入力のXML文書から目次を作るために対象要素を変数(element()*)に格納したコードです.目次の対象は 用語集 索引 章とその下の2階層のtopicref(DITAの場合)、section(DocBookの場合) を示しています. [DITAのコード] <xsl:variable name=”tocCandidatesElem” as=”element()*”> <xsl:sequence select=”$map/descendant::*[contains(@class,’ bookmap/indexlist ‘)]”/> <xsl:sequence select=”$map/descendant::*[contains(@class,’ bookmap/glossarylist ‘)]”/> <xsl:for-each select=”$map/descendant::*[contains(@class,’ bookmap/chapter ‘) or contains(@class,’ bookmap/appendix ‘)]”> <xsl:variable name=”topicRef” as=”element()” select=”.”/> <xsl:sequence select=”$topicRef/descendant-or-self::*[position() le 3]”/> </xsl:for-each> </xsl:variable> ※ $mapはbookmapを指すものとお考えください. [DocBookの場合] <xsl:variable name=”tocCandidatesElem” as=”element()*”> <xsl:sequence select=”/set/book[1]/glossary”/> <xsl:sequence select=”/set/book[1]/index”/> <xsl:for-each select=”/set/book[1]/chapter | /set/book[1]/appendix”> <xsl:variable name=”chapter” as=”element()” select=”.”/>…(Continue Reading)

HTML5への変換で使用できない文字は?

投稿者: Anonymous XMLをXSLTを使用してHTML5に変換しています.使用しているXSLTプロセッサはSaxon 9.1Bです.(古いDITA Open Tooolkitについてくるもの) <xsl:output method=”html” encoding=”UTF-8″ indent=”no” doctype-system=”about:legacy-compat” omit-xml-declaration=”yes”/> ところがあらぬ文字が混入しているとHTMLへのシリアライズでエラーが出ます. [xslt] D:DITA-OTDITA-OT1.7.5-xxxxpluginsco.xxxx.htmlxslxslhtmldita2htm.toc.xsl:194: Fatal Error! Illegal HTML character: decimal 129 この場合は、<xsl:value-of select=”$xxxx”/>の中に文字U+0081が入っていた場合です. XSLTによるHTML変換で発生するこのようなエラーを事前に検出し、抑制したいのですが、そもそもHTML5で許容されない文字が何であるかがわかりません. HTML(もしくはHTML5)で許容されない文字はどこでどのように定義されているのでしょうか?いろいろWebを探してみましたがどこで規定されているのかがわかりません. 参考URL XSLT throwing Illegal HTML character exception http://saxon-xslt-and-xquery-processor.13853.n7.nabble.com/XSLT-throwing-Illegal-HTML-character-exception-td5143.html ご存知の方おられましたら教えてください. 以上 よろしくお願いいたします. 解決 SERE0014 を throw しているのでしょうから、これでしょう: http://www.w3.org/TR/xslt-xquery-serialization/#HTML_CHARDATA Certain characters are permitted in XML, but not in HTML prior to…(Continue Reading)

xslで表の各行にあるセル(entry)数をカウントし、その値を各行比較して一番多い値を結果に出す

投稿者: Anonymous お手数ですが、お知恵いただきたく投稿させていただきました。 元となるxml構造の表で列数定義やセルの連結情報がないため、正しい列数が算出できず困っています。 やったこと 1. XSL1.0で各行のセル数は拾い、羅列したものの、その値をから行の最大値を比較できず断念。 2. XSL2.0でテンポラリーツリーで配列を使い値を比較。…が、経験値が浅く、かつ参考が少ないため解決策模索。(←現在) 環境:saxonb9-1-0-8j、JavaSEランタイム1.8.0、Windows10(1903) やりたいこと xslで表の各行(row)にあるセル(entry)数をカウントし、カウントした各行の値を比較し一番多いセルの数(最大値)を結果に出す。 ※行数・列数は固定されない前提です。 ※元となるxmlにセル数を追記しました。(ここで求めたい結果はセル数4) 元となるxml <table tocentry = "1"> <table.group charoff = "50" align = "left"> <table.body valign = "top"> セル数2:<row><entry valign = "middle" align = "center">000-00</entry><entry valign = "middle" align = "center">西海岸</entry></row> セル数4:<row><entry valign = "top">999-01</entry><entry valign = "top">海</entry><entry valign = "top">-</entry><entry valign = "top">-</entry></row> セル数4:<row><entry…(Continue Reading)

XMLからの正規化した行の出力

投稿者: Anonymous 次の様なXMLがあります. <?xml version=”1.0″ encoding=”UTF-8″?> <sect> <p> donguri korokoro donburiko </p> <p>koike ni hamatte saa taihen</p> <p>dojyou mo detekite konnnitiwa</p> <p> bocchann isshoni asobimasho </p> </sect> これから<p>を単位としてホワイトスペースを正規化して行にし donguri korokoro donburiko koike ni hamatte saa taihen dojyou mo detekite konnnitiwa bocchann isshoni asobimasho というテキスト出力を得たいです.最終行には改行はなくてかまいません. 今まではこんなスタイルシートを作っていましたが、 <?xml version=”1.0″ encoding=”UTF-8″?> <xsl:stylesheet xmlns:xsl=”http://www.w3.org/1999/XSL/Transform” xmlns:xs=”http://www.w3.org/2001/XMLSchema” exclude-result-prefixes=”xs” version=”2.0″> <xsl:output method=”text”…(Continue Reading)

XSLTでXMLの処理中に別のXMLを読み込んで処理する方法

投稿者: Anonymous XSLTで基本となるXMLを読み込んでrootから処理を行っている最中に、別のXMLファイルを読み込んで処理を行うことは可能でしょうか?可能であれば方法を教えて下さい。 例としては、 基本となるXMLのP要素を処理する際に、別のXMLファイルのP要素を参照するといった処理を想定しています。 解決 XML ファイルを読み込みたいだけでしたら、このあたりでできます: collection() doc() document() 回答者: Anonymous