ホームページ  >  記事  >  バックエンド開発  >  xslt を使用して XML を xhtml に解析するコード例

xslt を使用して XML を xhtml に解析するコード例

怪我咯
怪我咯オリジナル
2017-04-10 11:21:341445ブラウズ

xslt解析の基本フォーマットは以下の通りです。困っている友達は参考にしてください

解析にはxsltを使用してください基本的な形式は次のとおりです。 たとえば、

のコードは次のとおりです:

<?xml version="1.0" encoding="GB2312"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method=&#39;html&#39; version=&#39;1.0&#39; encoding=&#39;GB2312&#39; indent=&#39;yes&#39;/> 
<xsl:template match="/"> 
<html> 
<body> 
//这里可以包含一些xhtml的标签 
</body> 
</html> 
</xsl:template> 
</xsl:stylesheet>


(XML 文書を変換するための言語)、x-path (XML 文書内をナビゲートするための言語)、xsl-fo (XML ドキュメントをフォーマットするための言語)、http://www .php.cn/この Web サイトの関連コンテンツに関するチュートリアルを検索してください
前のコードで説明したように、xslt は a9f93108b0b3a236d8f307849e1b37ea...2716b7970188536aaafe21fa2efe938e
xslt については初めてなので、よく理解していません。ここでは重要なポイントをいくつか紹介します。
1. 再帰と送信 パラメータメソッド:
家系図を例に挙げると、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=&#39;html&#39; version=&#39;1.0&#39; encoding=&#39;GB2312&#39; indent=&#39;yes&#39;/> 
<xsl:template match="/"> 
<html> 
<body> 
<xsl:apply-templates select="person"> 
<xsl:with-param name="level" select="&#39;0&#39;"/> 
</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="@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 というパラメーターを定義します。 9f46d50fc1efb18c47a5f022a5fd4c2a 構文を使用してテンプレートを作成し、テンプレートをメイン テンプレートに追加するときにパラメータに値を割り当てます (43243beb2fcda3ec2ce639590e7c2e59)。 ..e94ab143aef4805f201a19ba8e8a2d4a)、

c4df24aa134e1321dae1bbc0e70e4482 2f93d5c7e50a96a95fad97ec4b37ec6d /xsl:apply-templates> では、パラメーター レベルの値は最初に「0」に割り当てられており、パラメーター レベル ($level) の値は、text-indent:{$ などのインデント値として使用されます。 level}em なので、XML コンテンツをレンダリングするときに最初のレイヤーはインデントされません。最初のレイヤーをレンダリングした後、

b57a5420a6dd170f5f5001d545ed8b23
ff93f53840efed4c90b2bec5eafab21d このように、メソッドは再帰を達成するためにパラメータ レベルの値を蓄積します。 value に 2 を追加することで、家系図の構造を実現するためのさまざまなレベルのインデントが実現されます。ここでは、ノード属性の値を取得するために @name などの @+Attribute を使用することも述べておきます。

2. パラメーターを使用して交互の行の色を変更します。

上記の例とパラメーター レベルを引き続き引用し、再帰中にパラメーターに +2 (偶数) の代わりに +1 (奇数) を与え、(. . test=" $level mod 2 = 0") または (.. test="$level mod 2 = 1") は、87aa7acf73d36be8ca85bc91197eda8c...c078c4fd130ec324d38bc095c4eaeb79 b490e3a477a758f8d417150b585fd42a...d5d6e75bd640df627ff3451c7e49476a 0deb431ca822a5ae1672ac1bd025a592奇数行と偶数行に異なる
背景を与える-color
により、インターレースされたカラー変更の効果が得られます。具体的なコードは次のとおりです:
コードは次のとおりです:

<?xml version="1.0" encoding="GB2312"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method=&#39;html&#39; version=&#39;1.0&#39; encoding=&#39;GB2312&#39; indent=&#39;yes&#39;/> 
<xsl:template match="/"> 
<html> 
<body> 
<xsl:apply-templates select="person"> 
<xsl:with-param name="level" select="&#39;0&#39;"/> 
</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>


三、符号转义以及CDATA语法:
目前碰到的只有“e84aacd5f768f485facc4bd6b8750f46” 要转义成67bffed8d39c986beaddeed3e8cd5568如果在
表达式里出现这两个符号,页面在预览的时候就会报错;
另外我们需要将原文件的内容原封不动的输出来,包括换行或上面的大于和小于号等页面元素,这时候就需要CDATA这个标签, CDATA全称character data,翻译为字符数据,数据不进行转义直接输出。语法格式如下:
37257cd4c239f5a1e042c3f605185721
例如:
db42c9d5aa7564004c0daff71411f68acb884f44f2f1937276917c04c3676183]]>
在页面上显示的内容将是"aac23f448b702b8b93a75e0945ea2f62cb884f44f2f1937276917c04c3676183";
四、几个教程中并没有提到的名词:
1、local-name();例子:00361f9c2ab69ee1cbfeb1ba4da20b50,这里所表达的意思就是当前节点的名字。
2、f3619dc8969622cfe315844131c7ff3b...dc728c903cc44e1b1becadaa331990fe,call-template和apply-template的区别,简单说apply是应用,call是调用。
用apply时,引擎自动搜索与当前select指定xpath的匹配节点相匹配的template(该template必须有属性match)并使用该template进行处理,此时需要指定的是select的path。
用call时就跟其它语言调用函数一样,必须指定name属性,相应的,该template必须有name属性,当然,也可以在这时with-param(当然相应的模板中有对应的param才行,不过这个不强制要求)。通过设置mode属性可以调用同一内容的不同表现形式,这个由自己去定义。
3、count(ancestor::*)这种写法是计算当前节点有多少个祖先节点,当然 ancestor也可以用child,following-sibling等xpath关系。
五、对于要符合多条件的判断,xslt不能很好的支持:
以家族树为例,我要取一个位于第二层的,名字叫Lichao的人,如果按字面理解我们可以写成361bc00243761ed36605043ffdd1ba40...c078c4fd130ec324d38bc095c4eaeb79,但是这样写在预览xml的时候就会报错,我也想用条件里面套条件这样的写法,也不符合语法,查了很多相关的资料,没有找到很好的解决办法。
以上是在学习和使用xslt对xml进行解析的过程中的一些感想和记录,xslt很强大,有很多功能都没有涉及,当然,我还要继续学习和研究。

以上がxslt を使用して XML を xhtml に解析するコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。