如何将父项的第一个子项中的属性移动到XSLT中的父项?

编程入门 行业动态 更新时间:2024-10-21 18:49:34
本文介绍了如何将父项的第一个子项中的属性移动到XSLT中的父项?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我是XSLT的初学者,我试图将Flash文本格式转换为基于HTML的格式。

有< LI> ;< / code>块< / code>块< / code>块包含1个或多个< FONT> 节点。我需要将内嵌css中的< FONT> 样式应用于< LI> ,并移除< FONT> 节点(第一个FONT子节点)。

b来自:

< LI> < FONT FACE =LatoSIZE =24COLOR =#F7941DLETTERSPACING =0KERNING =0> < I> ertrr< / I> < FONT SIZE =12COLOR =#4B4B4B> sdfsd< / FONT> < / FONT> < / LI>

收件人:

< li style =font-family:Lato; font-size:24px; color:#F7941D;> < I> ertrr< / I> < span style =font-size:12px; color:#4B4B4B;> sdfsd< / span> < / li>

(仅用于解释的示例 - 结束)

XML Source

< root> < TEXTFORMAT LEADING =2> < LI> < FONT FACE =LatoSIZE =24COLOR =#F7941DLETTERSPACING =0KERNING =0> < I> ertrr< / I> < FONT SIZE =12COLOR =#4B4B4B>< / FONT> < / FONT> < / LI> < / TEXTFORMAT> < TEXTFORMAT LEADING =2> < LI> < FONT FACE =LatoSIZE =24COLOR =#000000LETTERSPACING =0KERNING =0> < I>< U> ert< / U>< / I> < FONT SIZE =12COLOR =#4B4B4B>< / FONT> < / FONT> < / LI> < / TEXTFORMAT> < TEXTFORMAT LEADING =2> < LI> < FONT FACE =SystemSIZE =16COLOR =#4B4B4BLETTERSPACING =0KERNING =0> < B> hgjgj< / B> < FONT FACE =LatoSIZE =12>< / FONT> < / FONT> < / LI> < / TEXTFORMAT> < TEXTFORMAT LEADING =2> < LI> ghjghj ##dgsdg 预期产量

< div> < li style =font-family:Lato; font-size:24px; color:#F7941D;> < I> ertrr< / I>< span style =font-size:12px; color:#4B4B4B;>< / span> < / li> < li style =font-family:Lato; font-size:24px; color:#000000;> < I>< U> ert< / U>< / I>< span style =font-size:12px; color:#4B4B4B;>< / span> < / li> < li style =font-family:System; font-size:16px; color:#4B4B4B;> < B> hgjgj< / B>< span style =font-family:Lato; font-size:12px;>< / span> < / li> < li style =font-family:System; font-size:16px; color:#4B4B4B;> ghjghj < span style =font-family:Lato; font-size:12px;>< / span> < / li> < li style =font-family:Lato; font-size:12px; color:#4B4B4B;> @#dgsdg < span style =font-family:Gabriola;> sdfgdfg< / span> dsfg df < span style =font-size:16px;> gdsfg< / span> sd s < span style =font-family:Lucida Console;> d < I> fg df< / I> gs < span style =font-family:Verdana;> dg sdgfgsd< / span>< / span> gdfg < / li> < li style =font-family:Lato; font-size:24px; color:#000000;> < I>< U> ert< / U>< / I>< span style =font-size:12px; color:#4B4B4B;> sdfsd< / span> < / li> < / div>

我的代码:

<?xml version =1.0encoding =UTF-8?> < xsl:stylesheet xmlns:xsl =www.w3/1999/XSL/Transform version =1.0> < xsl:strip-space elements =*/> < xsl:output indent =yesmethod =html/> <! - 身份模板 - > < xsl:template match =node()| @ *> < xsl:copy> < xsl:apply-templates select =node()| @ */> < / xsl:copy> < / xsl:template> < xsl:template match =root> < div> < xsl:apply-templates /> < / div> < / xsl:template> < xsl:template match =FONT> < span> < xsl:attribute name =style> <! - - 收集属性 - > < xsl:variable name =styles> < xsl:if test =@ FACE> 目前产量 < DIV> < li style =font-family:Lato; font-size:24px; color:#F7941D;> < / li> < li style =font-family:Lato; font-size:24px; color:#000000;> < / li> < li style =font-family:System; font-size:16px; color:#4B4B4B;> < / li> < li style =font-family:System; font-size:16px; color:#4B4B4B;> < span style =font-family:Lato; font-size :12px;>< / span>< / span> < / li> < li style =font-family:Lato; font-size:12px; color:#4B4B4B;> < span style =font-family:Gabriola; > sdfgdfg< /跨度> dsfg df < span style =font-size:16px;> gdsfg< / span> sd s < span style =font-family:Lucida Console;> d < I> fg df< / I> gs < span style =font-family:Verdana;> dg sdgfgsd< / span>< / span> gdfg< / span> < / li> < li style =font-family:Lato; font-size:24px; color:#000000;> < / li> < / div>

解决方案

您应该创建一个命名模板来处理属性。以下是您需要的样式表

<?xml version =1.0encoding =utf-8?> ; < xsl:stylesheet version =1.0 xmlns:xsl =www.w3/1999/XSL/Transform> < xsl:strip-space elements =*/> < xsl:output indent =yesomit-xml-declaration =yes/> <! - 身份模板 - > < xsl:template match =node()| @ *> < xsl:copy> < xsl:apply-templates select =node()| @ */> < / xsl:copy> < / xsl:template> < xsl:template match =LI> < li> < xsl:attribute name =style> < xsl:call-template name =collect_attributes>

I'm a beginner to XSLT, I'm trying to convert flash Text Format into HTML based format

There are <LI></LI> blocks in the source xml and all <LI> blocks contains 1 or many <FONT> nodes. I need to apply the styles of the <FONT> in inline css to the <LI> and remove the <FONT> node (first FONT child).

( Example for explanation only - start ) From:

<LI> <FONT FACE="Lato" SIZE="24" COLOR="#F7941D" LETTERSPACING="0" KERNING="0"> <I>ertrr</I> <FONT SIZE="12" COLOR="#4B4B4B">sdfsd</FONT> </FONT> </LI>

To:

<li style="font-family:Lato; font-size:24px; color:#F7941D;"> <I>ertrr</I> <span style="font-size:12px; color:#4B4B4B;">sdfsd</span> </li>

( Example for explanation only - end )

XML Source

<root> <TEXTFORMAT LEADING="2"> <LI> <FONT FACE="Lato" SIZE="24" COLOR="#F7941D" LETTERSPACING="0" KERNING="0"> <I>ertrr</I> <FONT SIZE="12" COLOR="#4B4B4B"></FONT> </FONT> </LI> </TEXTFORMAT> <TEXTFORMAT LEADING="2"> <LI> <FONT FACE="Lato" SIZE="24" COLOR="#000000" LETTERSPACING="0" KERNING="0"> <I><U>ert</U></I> <FONT SIZE="12" COLOR="#4B4B4B"></FONT> </FONT> </LI> </TEXTFORMAT> <TEXTFORMAT LEADING="2"> <LI> <FONT FACE="System" SIZE="16" COLOR="#4B4B4B" LETTERSPACING="0" KERNING="0"> <B>hgjgj</B> <FONT FACE="Lato" SIZE="12"></FONT> </FONT> </LI> </TEXTFORMAT> <TEXTFORMAT LEADING="2"> <LI> <FONT FACE="System" SIZE="16" COLOR="#4B4B4B" LETTERSPACING="0" KERNING="0">ghjghj <FONT FACE="Lato" SIZE="12"></FONT> </FONT> </LI> </TEXTFORMAT> <TEXTFORMAT LEADING="2"> <LI> <FONT FACE="Lato" SIZE="12" COLOR="#4B4B4B" LETTERSPACING="0" KERNING="0">@#dgsdg <FONT FACE="Gabriola">sdfgdfg</FONT> dsfg df <FONT SIZE="16">gdsfg</FONT>sd s <FONT FACE="Lucida Console">d <I>fg df</I> gs <FONT FACE="Verdana">dg sdgfgsd</FONT> </FONT> gdfg </FONT> </LI> </TEXTFORMAT> <TEXTFORMAT LEADING="2"> <LI> <FONT FACE="Lato" SIZE="24" COLOR="#000000" LETTERSPACING="0" KERNING="0"> <I><U>ert</U></I> <FONT SIZE="12" COLOR="#4B4B4B">sdfsd</FONT> </FONT> </LI> </TEXTFORMAT> </root>

Expected Output

<div> <li style="font-family:Lato; font-size:24px; color:#F7941D;"> <I>ertrr</I><span style="font-size:12px; color:#4B4B4B;"></span> </li> <li style="font-family:Lato; font-size:24px; color:#000000;"> <I><U>ert</U></I><span style="font-size:12px; color:#4B4B4B;"></span> </li> <li style="font-family:System; font-size:16px; color:#4B4B4B;"> <B>hgjgj</B><span style="font-family:Lato; font-size:12px; "></span> </li> <li style="font-family:System; font-size:16px; color:#4B4B4B;"> ghjghj <span style="font-family:Lato; font-size:12px; "></span> </li> <li style="font-family:Lato; font-size:12px; color:#4B4B4B;"> @#dgsdg <span style="font-family:Gabriola; ">sdfgdfg</span> dsfg df <span style="font-size:16px; ">gdsfg</span>sd s <span style="font-family:Lucida Console; ">d <I>fg df</I> gs <span style="font-family:Verdana; ">dg sdgfgsd</span></span> gdfg </li> <li style="font-family:Lato; font-size:24px; color:#000000;"> <I><U>ert</U></I><span style="font-size:12px; color:#4B4B4B;">sdfsd</span> </li> </div>

My code:

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="www.w3/1999/XSL/Transform" version="1.0"> <xsl:strip-space elements="*"/> <xsl:output indent="yes" method="html"/> <!-- identity template --> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="root"> <div> <xsl:apply-templates/> </div> </xsl:template> <xsl:template match="FONT"> <span> <xsl:attribute name="style"> <!-- collect attributes --> <xsl:variable name="styles"> <xsl:if test="@FACE"> <xsl:value-of select="concat('font-family:', @FACE)"/> <xsl:text>; </xsl:text> </xsl:if> <xsl:if test="@SIZE"> <xsl:value-of select="concat('font-size:', @SIZE, 'px')"/> <xsl:text>; </xsl:text> </xsl:if> <xsl:if test="@COLOR"> <xsl:value-of select="concat('color:', @COLOR)"/> <xsl:text>;</xsl:text> </xsl:if> </xsl:variable> <xsl:value-of select="$styles"/> </xsl:attribute> <xsl:apply-templates/> </span> </xsl:template> <!-- remove unwanted attributes --> <xsl:template match="@LETTERSPACING|@KERNING"/> <!-- Replace <LI> with <li> --> <xsl:template match="LI"> <li> <xsl:attribute name="style"> <!-- collect attributes --> <xsl:variable name="styles"> <xsl:if test="FONT/@FACE"> <xsl:value-of select="concat('font-family:', FONT/@FACE)"/> <xsl:text>; </xsl:text> </xsl:if> <xsl:if test="FONT/@SIZE"> <xsl:value-of select="concat('font-size:', FONT/@SIZE, 'px')"/> <xsl:text>; </xsl:text> </xsl:if> <xsl:if test="FONT/@COLOR"> <xsl:value-of select="concat('color:', FONT/@COLOR)"/> <xsl:text>;</xsl:text> </xsl:if> </xsl:variable> <!-- delete trailing spaces --> <xsl:value-of select="$styles"/> </xsl:attribute> <xsl:apply-templates/> </li> </xsl:template> <!-- Remove TEXTFORMAT --> <xsl:template match="TEXTFORMAT"> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet>

Current Output

<div> <li style="font-family:Lato; font-size:24px; color:#F7941D;"> <span style="font-family:Lato; font-size:24px; color:#F7941D;"><I>ertrr</I><span style="font-size:12px; color:#4B4B4B;"></span></span> </li> <li style="font-family:Lato; font-size:24px; color:#000000;"> <span style="font-family:Lato; font-size:24px; color:#000000;"><I><U>ert</U></I><span style="font-size:12px; color:#4B4B4B;"></span></span> </li> <li style="font-family:System; font-size:16px; color:#4B4B4B;"> <span style="font-family:System; font-size:16px; color:#4B4B4B;"><B>hgjgj</B><span style="font-family:Lato; font-size:12px; "></span></span> </li> <li style="font-family:System; font-size:16px; color:#4B4B4B;"> <span style="font-family:System; font-size:16px; color:#4B4B4B;">ghjghj <span style="font-family:Lato; font-size:12px; "></span></span> </li> <li style="font-family:Lato; font-size:12px; color:#4B4B4B;"> <span style="font-family:Lato; font-size:12px; color:#4B4B4B;">@#dgsdg <span style="font-family:Gabriola; ">sdfgdfg</span> dsfg df <span style="font-size:16px; ">gdsfg</span>sd s <span style="font-family:Lucida Console; ">d <I>fg df</I> gs <span style="font-family:Verdana; ">dg sdgfgsd</span></span> gdfg </span> </li> <li style="font-family:Lato; font-size:24px; color:#000000;"> <span style="font-family:Lato; font-size:24px; color:#000000;"><I><U>ert</U></I><span style="font-size:12px; color:#4B4B4B;">sdfsd</span></span> </li> </div>

解决方案

You should create a named template to process the attributes. The following is the stylesheet that you need

<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="www.w3/1999/XSL/Transform"> <xsl:strip-space elements="*"/> <xsl:output indent="yes" omit-xml-declaration="yes"/> <!-- identity template --> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="LI"> <li> <xsl:attribute name="style"> <xsl:call-template name="collect_attributes"> <xsl:with-param name="FACE" select="*[1][name()='FONT']/@FACE"/> <xsl:with-param name="SIZE" select="*[1][name()='FONT']/@SIZE"/> <xsl:with-param name="COLOR" select="*[1][name()='FONT']/@COLOR"/> </xsl:call-template> </xsl:attribute> <xsl:apply-templates/> </li> </xsl:template> <xsl:template match="LI/FONT[1]"> <xsl:apply-templates/> </xsl:template> <xsl:template match="FONT[not(parent::LI)]"> <span> <xsl:attribute name="style"> <xsl:call-template name="collect_attributes"> <xsl:with-param name="FACE" select="@FACE"/> <xsl:with-param name="SIZE" select="@SIZE"/> <xsl:with-param name="COLOR" select="@COLOR"/> </xsl:call-template> </xsl:attribute> </span> </xsl:template> <!-- named template to process the attributes --> <xsl:template name="collect_attributes"> <xsl:param name="COLOR"/> <xsl:param name="FACE"/> <xsl:param name="SIZE"/> <!-- collect attributes --> <xsl:variable name="styles"> <xsl:if test="string-length($FACE) &gt; 0"> <xsl:value-of select="concat('font-family:', $FACE)"/> <xsl:text>; </xsl:text> </xsl:if> <xsl:if test="string-length($SIZE) &gt; 0"> <xsl:value-of select="concat('font-size:', $SIZE, 'px')"/> <xsl:text>; </xsl:text> </xsl:if> <xsl:if test="string-length($COLOR) &gt; 0"> <xsl:value-of select="concat('color:', $COLOR)"/> <xsl:text>;</xsl:text> </xsl:if> </xsl:variable> <!-- delete trailing spaces --> <xsl:value-of select="normalize-space($styles)"/> </xsl:template> <xsl:template match="root"> <div> <xsl:apply-templates/> </div> </xsl:template> <xsl:template match="TEXTFORMAT"> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet>

更多推荐

如何将父项的第一个子项中的属性移动到XSLT中的父项?

本文发布于:2023-11-23 15:56:16,感谢您对本站的认可!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:如何将   个子   属性   XSLT

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!