1. ホーム
  2. Web プログラミング
  3. XML/RSS
  4. XMLの例

xslt を使って xml を xhtml にパースするためのコード

2022-01-18 08:55:32
xsltでパースする場合の基本的な書式は、例えば次のようなものです。
コピーコード コードは以下の通りです。

<?xml version="1.0" encoding="GB2312"? >
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='html' version='1.0' encoding='GB2312' indent='yes'/>
<xsl:template match="/">
<html>
<body>
//This can contain some xhtml tags
</body>
</html>
</xsl:template>
</xsl:stylesheet>

XSLはExtended Stylesheet Language (EXtensible Stylesheet Language)のことで、xslはxml用のスタイルシートです。xslにはxslt(XML文書の変換言語)、x-path(XML文書内のナビゲーション言語)、xsl-fo(XML文書のフォーマット言語)という三つの部分があり、 http://www.w3cschool.cn/这个网站中找到相关内容的教程 で見ることができます。
前のコードで説明したように、xslt は xml のバージョンから始まり、変換のために <xsl:style-sheeet ... >... </xsl:style-sheeet> 形式を使っています。
xsltに出会ったのは今回が初めてなので、あまりよく分かっていませんので、勉強しながら使っているうちに出てきたポイントをいくつか紹介します。
I. 再帰とパラメータパッシングメソッド
家系図を例にとると、xmlファイルは以下のようになります。
コピーコード コードは以下の通りです。

<?xml version="1.0" encoding="ISO-8859-1"? >
<?xml-stylesheet type="text/xsl" href="digui.xsl"? >
<person name="Otto" sex="mael" age="60">
  <person name="Sandra" sex="mael" age="35">
  <person name="Lichao" sex="femael" age="34">
   <person name="Zhangsan" sex="mael" age="12"/>
  </person>
  <person name="Eric" sex="femael" age="36">
   <person name="HaLi" sex="mael" age="18"/>
  </person>
  <person name="Lisi" sex="mael" age="30">
   <person name="HeLi" sex="mael" age="6"/>
   <person name="Andy" sex="femael" age="13"/>
  </person>
  </person>
</person>

さて、家族関係を表現するxsltを書かなければならないが、実は家族関係は家系図なので、このような関係を表現するために、最大の祖先、そして世代別にそれぞれインデントして、最小の世代は行末に、最もインデントし、木のレベルが出るように出力する;以下はxslファイルのコードである。
コピーコード コードは以下の通りです。

<?xml version="1.0" encoding="GB2312"? >
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='html' version='1.0' encoding='GB2312' indent='yes'/>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates select="person">
<xsl:with-param name="level" select="'0'"/>
</xsl:apply-templates>
</body>
</html>
</xsl:template>
<xsl:template match="person">
<xsl:param name="level"/>
<p style="text-indent:{$level}em">name:<xsl:value-of select="@name"/>,sex:<xsl:value-of select=& quot;@sex"/>,age:<xsl:value-of select="@age"/></p>
<xsl:apply-templates select="person">
<xsl:with-param name="level" select="$level + 2"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>

ここでは、まず、テンプレートの中にlevelというパラメータを<xsl:param name="level"/> という構文で定義し、メインテンプレートの中でパラメータに値を割り当て( <xsl:template match="/">... </xsl:template> )テンプレートの追加時に、パラメータに値を割り当て、その際に、その
<xsl:apply-templates select="person"> <xsl:with-param name="level" select="'0'"/> </xsl: apply-templates>では、最初にパラメータlevelの値を"0"に代入し、text-indentなどのインデントの値として、パラメータlevelの値($level)を使っています。 {$level}emのように、xmlコンテンツのレンダリング時には、最初のレベルをインデントせず、xmlコンテンツのレンダリング後には、最初のレベルをインデントしないようにしています。最初のレベルはインデントされず、最初のレベルをレンダリングした後、そのレンダリングに必要な
<xsl:apply-templates select="person">
<xsl:with-param name="level" select="$level + 2"/>
</xsl:apply-templates>
このようなメソッドは、パラメータレベルの値を蓄積することで再帰性を実現し、各レベルのレンダリングごとにパラメータ値を2加算することで、異なるレベルのインデントを実現してファミリーツリー構造を実現しています。ここで、@+属性(@nameなど)によってノードのプロパティ値を取得していることも重要な点として挙げられます。
II. パラメータを使用して、線をまたぐ色の変化を実現する。
まだ上記の例とパラメータレベルを引用して、我々は再帰的にパラメータを+2(偶数)の代わりに+1(奇数)を与える、(... test="$level mod 2 = 0" )または(... test="$level mod 2 = 1")によって、奇数と偶数の行の選択を達成するには、<xsl:choose> <xsl:when test="$level mod 2 = 0"> と使用します。 ... </xsl:when> <xsl:otherwise>... </xsl:otherwise> </xsl:choose> は、奇数列と偶数列に異なる背景色を与え、以下のコードで代替行の色を変更する効果を実現することができます。
コピーコード コードは以下の通りです。

<?xml version="1.0" encoding="GB2312"? >
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='html' version='1.0' encoding='GB2312' indent='yes'/>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates select="person">
<xsl:with-param name="level" select="'0'"/>
</xsl:apply-templates>
</body>
</html>
</xsl:template>
<xsl:template match="person">
<xsl:param name="level"/>
<xsl:choose>
<xsl:when test="$level mod 2 = 0">
<p style="text-indent:{$level}em;background-color:#DDD">name:<xsl:value-of select="@name"/>,sex:< xsl:value-of select="@sex"/>,age:<xsl:value-of select="@age"/></p>
</xsl:when>
<xsl:otherwise>
<p style="text-indent:{$level}em;background-color:#EEE">name:<xsl:value-of select="@name"/>,sex:< xsl:value-of select="@sex"/>,age:<xsl:value-of select="@age"/></p>
</xsl:otherwise>
<xsl:apply-templates select="person">
<xsl:with-param name="level" select="$level + 1"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>

III. シンボリックエスケープとCDATA構文。
現在、"<" と ">" のみ &lt; と &gt; にエスケープされることがあります。この 2 つの記号が式の中に現れると、ページはプレビューでエラーを報告します。
また、我々は、元のファイルの内容をそのまま出力する必要がある、改行または大なり小なり記号や他のページ要素の上を含む、その後、CDATAタグ、CDATAフルネーム文字データ、文字データとして変換する必要があり、データは出力に直接エスケープされていません。構文形式は次のとおりです。
<! [CDATA [表示する文字が配置される場所]]>

<! [CDATA[<person name="ason"></person>]]>
ページに表示される内容は、"<person name="ason"></person>" となる予定です。
IV. チュートリアルに記載されていない用語をいくつか。
1. local-name(); 例: <xsl:value-of select="local-name()"/>, ここで意味するのは、現在のノードの名前です。
2. <xsl:call-template name="" mode="">... </xsl:call-template>, call-template と apply-template の違い、簡単に言うと apply は apply で call は call ですね。
apply を使用すると、エンジンは自動的に現在の select 指定 xpath のマッチングノードにマッチするテンプレートを検索し(テンプレートは match 属性を持つ必要があります)、そのテンプレートを使って処理を行います。このとき指定する必要があるのは select のパスです。
関数を呼び出す場合、name属性を指定する必要があり、それに伴ってテンプレートもname属性を持つ必要がありますが、もちろんwith-paramで呼び出すこともできます(もちろん、対応するテンプレートは対応するparamを持っていますが、これは必須ではありません)。mode属性を設定することで、同じコンテンツでも異なる表現を呼び出すことができ、その定義はあなた次第です。
3. count(ancestor::*) は、現在のノードがいくつの祖先ノードを持つかを計算するために書かれています。もちろん、ancestor は child や following-sibling などの xpath 関係も使用可能です。
V. xsltがうまくサポートしない、複数の条件を満たさなければならない判定用。
家系図を例にとると、2階層目にいるLichaoという人を取りたいのですが、文字通りに書くと <xsl:when test="count(ancestor::*) =2 && *[@name] = 'Lichao'">... と書けるはずです。</xsl:when> しかし、この書き込みは、プレビューのxmlでエラーが報告されます、私はまた、条件のセット内の条件を使用したいので、書き込み、また構文を満たしていない、多くの関連情報をチェックし、良い解決策を見つけることができませんでした。
上記は、xmlを解析するxsltを使用して学習の過程でいくつかの考えやレコードは、xsltは非常に強力ですが、多くの機能が関与していない、もちろん、私は学習と研究を継続する必要があります。