我正在尝试将基于 Flash 的文本格式转换为基于 HTML 的文本。
有<LI></LI>源 xml 中的 block 我需要添加相邻的 <LI> <ul> 内的 block block 。
<p></p>
<li></li> ------
<li></li> | - should be wrapped with <ul> tag
<li></li> ------
<p></p>
<li></li>
<li></li>
<li></li>
<p></p>
XML 源代码
<root>
<TEXTFORMAT LEADING="2">
<P ALIGN="LEFT">
edfg
</P>
</TEXTFORMAT>
<TEXTFORMAT LEADING="2">
<P ALIGN="LEFT">
sdgfdsgsds
</P>
</TEXTFORMAT>
<TEXTFORMAT LEADING="2">
<LI>
sdfgdsg
</LI>
</TEXTFORMAT>
<TEXTFORMAT LEADING="2">
<LI>
dsgdfgdsfg
</LI>
</TEXTFORMAT>
<TEXTFORMAT LEADING="2">
<LI>
<FONT FACE="Lato" SIZE="12" COLOR="#4B4B4B" LETTERSPACING="0" KERNING="0">errytrtyr</FONT>
</LI>
</TEXTFORMAT>
<TEXTFORMAT LEADING="2">
<P ALIGN="LEFT">
sdgfdsgsds
</P>
</TEXTFORMAT>
<TEXTFORMAT LEADING="2">
<LI>
<FONT FACE="System" SIZE="16" COLOR="#4B4B4B" LETTERSPACING="0" KERNING="0">nm,hjku
<FONT FACE="Lato" SIZE="12"></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">
<P ALIGN="CENTER">
<FONT FACE="Lato" SIZE="12" COLOR="#4B4B4B" LETTERSPACING="0" KERNING="0">centered text</FONT>
</P>
</TEXTFORMAT>
</root>
预期输出
<div>
<div style="text-align:LEFT; ">
edfg
</div>
<div style="text-align:LEFT; ">
sdgfdsgsds
</div>
<ul>
<li>
sdfgdsg
</li>
<li>
dsgdfgdsfg
</li>
<li>
<FONT COLOR="#4B4B4B" FACE="Lato" SIZE="12">errytrtyr</FONT>
</li>
</ul>
<div style="text-align:LEFT; ">
sdgfdsgsds
</div>
<ul>
<li>
<FONT COLOR="#4B4B4B" FACE="System" SIZE="16">nm,hjku
<FONT FACE="Lato" SIZE="12"></FONT>
</FONT>
</li>
<li>
<FONT COLOR="#4B4B4B" FACE="System" SIZE="16">
<B>hgjgj</B>
<FONT FACE="Lato" SIZE="12"></FONT>
</FONT>
</li>
</ul>
<div style="text-align:CENTER; ">
<FONT COLOR="#4B4B4B" FACE="Lato" SIZE="12">centered text</FONT>
</div>
</div>
我的代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/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>
<!-- remove unwanted attributes -->
<xsl:template match="@LETTERSPACING|@KERNING"/>
<!-- Remove <P> tag and set the alignment -->
<xsl:template match="P">
<div>
<xsl:attribute name="style">
<!-- collect attributes -->
<xsl:variable name="styles">
<xsl:if test="@ALIGN">
<xsl:value-of select="concat('text-align:', @ALIGN )"/>
<xsl:text>; </xsl:text>
</xsl:if>
</xsl:variable>
<!-- delete trailing spaces -->
<xsl:value-of select="$styles"/>
</xsl:attribute>
<xsl:apply-templates/>
</div>
</xsl:template>
<!-- Replace <LI> with <li> -->
<xsl:template match="LI">
<li><xsl:apply-templates/></li>
</xsl:template>
<!-- Remove TEXTFORMAT -->
<xsl:template match="TEXTFORMAT">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
最佳答案
以下 XSLT 1.0 转换为您提供了似乎想要的结果:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes" method="html"/>
<xsl:key name="list" match="TEXTFORMAT[LI]" use="generate-id(
(self::*|preceding-sibling::*)[LI][
not(preceding-sibling::*[1][LI])
][last()]
)" />
<!-- 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>
<!-- Remove <P> tag and set the alignment -->
<xsl:template match="P">
<div>
<xsl:attribute name="style">
<xsl:apply-templates select="@*" mode="css" />
</xsl:attribute>
<xsl:apply-templates/>
</div>
</xsl:template>
<xsl:template match="@ALIGN" mode="css">
<xsl:value-of select="concat('text-align:', ., ';')"/>
</xsl:template>
<!-- add more -->
<xsl:template match="@*" mode="css" />
<!-- remove unwanted attributes -->
<xsl:template match="@LETTERSPACING|@KERNING"/>
<xsl:template match="TEXTFORMAT[LI]">
<xsl:variable name="adjacent" select="key('list', generate-id())" />
<xsl:if test="$adjacent">
<ul>
<xsl:apply-templates select="$adjacent/LI" />
</ul>
</xsl:if>
</xsl:template>
<!-- Replace <LI> with <li> -->
<xsl:template match="LI">
<li><xsl:apply-templates/></li>
</xsl:template>
<!-- Remove TEXTFORMAT -->
<xsl:template match="TEXTFORMAT">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
结果:
<div>
<div style="text-align:LEFT;">
edfg
</div>
<div style="text-align:LEFT;">
sdgfdsgsds
</div>
<ul>
<li>
sdfgdsg
</li>
<li>
dsgdfgdsfg
</li>
<li><FONT FACE="Lato" SIZE="12" COLOR="#4B4B4B">errytrtyr</FONT></li>
</ul>
<div style="text-align:LEFT;">
sdgfdsgsds
</div>
<ul>
<li><FONT FACE="System" SIZE="16" COLOR="#4B4B4B">nm,hjku
<FONT FACE="Lato" SIZE="12"></FONT></FONT></li>
<li><FONT FACE="System" SIZE="16" COLOR="#4B4B4B"><B>hgjgj</B><FONT FACE="Lato" SIZE="12"></FONT></FONT></li>
</ul>
<div style="text-align:CENTER;"><FONT FACE="Lato" SIZE="12" COLOR="#4B4B4B">centered text</FONT></div>
</div>
从字面上看,解决方案的关键是这种结构:
<xsl:key name="list" match="TEXTFORMAT[LI]" use="generate-id(
(self::*|preceding-sibling::*)[LI][
not(preceding-sibling::*[1][LI])
][last()]
)" />
这索引每个 TEXTFORMAT[LI]在文档中最近的唯一 ID TEXTFORMAT[LI]开始当前系列,即最近的没有 TEXTFORMAT[LI] 的系列在此之前。
从那里我们可以决定 <xsl:template match="TEXTFORMAT[LI]">是否为任何给定的 TEXTFORMAT[LI] 输出一些东西.
关于xml - 我们如何识别一组节点并将该组添加到另一个 XSLT 中 XML 源结构不同的节点中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39139742/
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的rubyyaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir
当谈到运行时自省(introspection)和动态代码生成时,我认为ruby没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最