Maison  >  Article  >  développement back-end  >  Exemple de code utilisant xslt pour analyser XML en xhtml

Exemple de code utilisant xslt pour analyser XML en xhtml

怪我咯
怪我咯original
2017-04-10 11:21:341392parcourir

xsltLe format de base pour l'analyse est le suivant. Les amis qui en ont besoin peuvent Pour référence, le format de base de

utilisant xslt pour l'analyse est le suivant : Par exemple, le code

est le suivant :

<?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>


XSL fait référence à Extended Style Sheet Language (EXtensible Stylesheet Language), xsl est une feuille de style de xml, xsl comprend 3 parties, à savoir : xslt (un langage utilisé pour convertir des documents XML), x-path (un langage utilisé pour naviguer dans les documents XML ) , xsl-fo (un langage de formatage de documents XML), vous pouvez trouver des tutoriels sur le contenu associé sur http://www.php.cn/
Comme le code précédent, xslt. commence avec la version XML et la convertit au format 8e39a3bdbbd74c11dd5aa8f47684304a...aeb9c90fe25c92ed888e3364e066f191
C'est la première fois que je contacte xslt, je ne le fais pas. Je n'en ai pas une compréhension approfondie. Voici juste une liste de quelques points clés que j'ai rencontrés lors de son apprentissage et de son utilisation
1 Méthodes de récursivité et de passage de paramètres :
Avec un Prendre le. arbre généalogique à titre d'exemple, le fichier xml ressemble à ceci :

Le code est le suivant :

<?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>


Maintenant, nous devons écrire un xslt pour exprimer le relation de la famille. En fait, la famille La relation est un arbre généalogique, nous exprimons donc une telle relation en produisant différents niveaux d'indentation. L'ancêtre le plus grand est ensuite indenté par génération. La génération la plus jeune est à la fin et est la plus indentée. . De cette façon, la hiérarchie de l'arbre ressort ; voici le code du fichier xsl :

Le code est le suivant :

<?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>


Ici. nous définissons d'abord un fichier appelé Pour les paramètres de niveau, utilisez une syntaxe telle que 9f46d50fc1efb18c47a5f022a5fd4c2a, puis dans le modèle principal (43243beb2fcda3ec2ce639590e7c2e59...< ;/xsl:template>) Lors de l'ajout d'un modèle, attribuez des valeurs aux paramètres,
ca90d88675738db87d7b04a71bd97b48 5fab6f4ef5ba67beefbf8b64843865fa 546e973636cedaa8b683fd88387bbca8, la valeur du niveau de paramètre est initialement attribuée à "0", et nous utilisons la valeur du niveau de paramètre ($level) comme valeur d'indentation, par exemple as text-indent :{$level}em, donc rendu Lors du rendu du contenu XML, le premier calque n'est pas indenté Après le rendu du premier calque, nous passons
ca90d88675738db87d7b04a71bd97b48
f38bc1ca77331bc3261377d58a07351c
ff93f53840efed4c90b2bec5eafab21d pour obtenir la récursivité, afin que chaque couche soit rendue, ajoutez 2 à la valeur du paramètre, réalisant ainsi différents niveaux d'indentation pour réaliser la structure de l'arbre généalogique ; permettez-moi également de mentionner ici que nous utilisons des attributs @+ tels que @name pour obtenir ; la valeur de l'attribut du nœud.

2. Utilisez des paramètres pour changer les couleurs sur des lignes alternées : En citant toujours l'exemple ci-dessus et le niveau du paramètre, nous donnons au paramètre +1 (nombre impair) au lieu de +2 (nombre pair). ) lors de la récursion, via (.. test="$level mod 2 = 0") ou (.. test="$level mod 2 = 1"), vous pouvez sélectionner des lignes paires ou impaires. Nous utilisons effa80a66a779826bcb4442171259c31...4e37efb749bb44367457e98d023e947b a55cf22f6c1d4a7b90f258d645187dcc...dedcde3e98667245280386606663c6a0 ;give La
couleur de fond est différente pour les lignes impaires et les lignes paires, obtenant ainsi l'effet de changer de couleur sur les lignes alternées. Le code spécifique est le suivant :
<.> Le code est le suivant :

<?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很强大,有很多功能都没有涉及,当然,我还要继续学习和研究。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn