我正在使用XSLT将包含复杂数据结构、自由文本等的xml文档转换为HTML文档。我处理的文档可以包含或不包含结构项,如果存在结构标记,则可以任意嵌套。数据标记可以引用任何类型的商品,因此我事先不知道XML文档的内容。
文件看起来像
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="my.xsl"?>
<doc>
<elementStructure type="tag">
The following items are cars:
<Car id="12" type="data" value="Ferrari"> this is a sport car.
<structureLev2 type="tag">
<Model id="432" value="458" />
<Rim id="55" value="wheels of car" type="data">
<Tire id="234" value="front" type="data">
<Note id="33" value="special tire" type="data"/> size of front is less that rear.
<TypeTire id="44" value="radial tire" type="data"/>
</Tire>
</Rim>
</structureLev2>
</Car>
</elementStructure>
<elementStructure type="tag">
Other text
<Car id="22" type="data" value="Ford">
this is a family car.
<structureLev2 type="tag">
<Model id="872" value="Mondeo" />
<Rim id="45" value="wheels of car" type="data">
<Tire id="734" value="front" type="data">
<Note id="63" value="normal tire" type="data"/> spare tire could be replaced by run-flat.
<TypeTire id="84" value="tubeless tire" type="data"/>
</Tire>
</Rim>
</structureLev2>
</Car>
</elementStructure>
</doc>
desiderata HTML文档应类似于:
<section>
Some text....
<ul>
<li>Car - Ferrari (this is a sport car.)</li>
<li>Rim - wheels of the car:</li>
<ul>
<li>Tire - front Note: special tire (size of front is less than rear).</li>
<li>TypeTire - radial tire
</ul>
</ul>
</section>
事实上,我不知道这是否是一个好的解决方案,但是因为我不知道我的xml是否包含结构标签,所以我使用了一个“开关”来在两个主模板之间进行选择。
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:strip-space elements="*"/>
<xsl:template match="doc">
<html>
<body>
<xsl:choose>
<xsl:when test="//*[@type='tag']">
<xsl:call-template name="stuct" />
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="plain" />
</xsl:otherwise>
</xsl:choose>
</body>
</html>
</xsl:template>
<xsl:template match="doc/*[@type='tag']" name="stuct">
<h3>
<xsl:value-of select="text()"/>
</h3>
<xsl:apply-templates mode="str"/>
</xsl:template>
<xsl:template match="doc/*[@type='tag']" mode="str">
<ul>
<li>
<xsl:call-template name="dataElem"/>
<xsl:apply-templates mode="str"/>
</li>
</ul>
</xsl:template>
<xsl:template match="doc/*[@type='data']" name="dataElem">
<xsl:for-each select="descendant::node()[not(@type='tag')]">
<xsl:value-of select="name(.)"/>: <xsl:value-of select="@value" /> (<xsl:value-of select="text()"/>)<br/>
</xsl:for-each>
</xsl:template>
<xsl:template match="doc/*[@type='data']" name="plain">
<xsl:call-template name="dataElem" />
</xsl:template>
</xsl:stylesheet>
在我得到的所有问题中,从代码本身开始:-)出现的一个问题是关于文本的。我希望文本甜菜标签可能只出现一次,并且在“解析”元素之后。有可能吗?
很难从一个单一的、不完整的示例中辨别出所需转换的逻辑。此外,我怀疑提供的输出实际上是不正确的——因为没有明显的理由将“Rim”提升为“Car”的兄弟,而在原始文档中它是“Car”的子代。
也许这样的东西可以为你工作:
XSLT1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates select="*"/>
</body>
</html>
</xsl:template>
<xsl:template match="elementStructure">
<section>
<xsl:value-of select="normalize-space(text())"/>
<ul>
<xsl:apply-templates select="*"/>
</ul>
</section>
</xsl:template>
<xsl:template match="*[@type='data']">
<li>
<xsl:value-of select="concat(name(), ' - ', @value)"/>
<xsl:if test="text()">
<xsl:value-of select="concat(' (', normalize-space(text()), ')')"/>
</xsl:if>
<xsl:if test="descendant::*[@type='data']">
<ul>
<xsl:apply-templates select="*"/>
</ul>
</xsl:if>
</li>
</xsl:template>
</xsl:stylesheet>
应用于示例输入时,结果将为:
<html>
<body>
<section>The following items are cars:
<ul>
<li>Car - Ferrari (this is a sport car.)
<ul>
<li>Rim - wheels of car
<ul>
<li>Tire - front (size of front is less that rear.)
<ul>
<li>Note - special tire</li>
<li>TypeTire - radial tire</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</section>
<section>Other text
<ul>
<li>Car - Ford (this is a family car.)
<ul>
<li>Rim - wheels of car
<ul>
<li>Tire - front (spare tire could be replaced by run-flat.)
<ul>
<li>Note - normal tire</li>
<li>TypeTire - tubeless tire</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</section>
</body>
</html>
呈现为:
包含由管道分隔的数字列表的文件可以有重复项。需要编写map reduce程序,在原始输入顺序中列出不重复的数字。我可以删除重复项,但不保留输入顺序。
问题内容: Java Set是否保留顺序?有一种方法将Set返回给我,并且假定数据是有序的,但是遍历Set时,数据是无序的。有没有更好的方法来解决这个问题?是否需要更改方法以返回Set以外的内容? 问题答案: 该Set接口不提供任何订购保证。 它的子接口代表根据某种标准排序的集合。在Java 6中,有两个实现的标准容器。他们是和。 除了SortedSet接口之外,还有类。它记住元素插入到集合中的顺
Java集是否保持顺序?一个方法返回一个集合给我,假设数据是有序的,但是在集合上迭代,数据是无序的。有更好的方法来管理这个吗?这个方法需要改变来返回集合以外的东西吗?
问题内容: 我正在编写一个Java程序,该程序读取xml文件,进行一些修改并写回xml。 使用标准的Java xml DOM api,不会保留属性的顺序。也就是说,如果我有一个输入文件,例如: 我可能会得到一个输出文件: 是正确的,因为XML规范说order属性并不重要。 但是,我的程序需要保留属性的顺序,以便一个人可以使用diff工具轻松比较输入和输出文档。 一种解决方案是使用SAX(而不是DO
我有一个可用的列表名,我正在按blockIndex属性对这些列表进行排序和分组,如下所示: 问题是分组的结果不按block Index排序。
问题内容: Java的foreach循环是否从第一个对象开始,并且以线性方式工作到结束?例如 是否总是先处理字符串“ Zoe”,然后处理“ Bob”等?没有排序发生?我已经对它进行了测试,但没有找到任何东西,但是我需要保证,在文档中找不到任何东西。 问题答案: 是。顺序不变。这适用于Java类集合框架的所有类型的集合,这些集合实现由for循环使用的迭代器接口。如果要对数组进行排序,则可以使用Arr