我是 XSLT 的初学者,但必须解决以下问题,并希望 StackOfJoel 中的一些聪明人能帮助我:我有一些工作 xslt 代码(1.1!不能使用 2.0)将 XHTML 转换为 XML,新的要求是:
- 某个 div 元素(具有特定的属性值)始终包含在表中;应该将 div 转移到一个新元素(NUREQ)中,并且应该删除所有周围的表结构
- 任何其他表格都应该被保留,任何其他 div 都不应该被剪掉,而是自己转换成不同的元素(文本)!
问题是:我不能直接在模板匹配中匹配属性,因为我必须使属性值匹配不区分大小写(我使用翻译 - 有没有其他方法可以直接在模板匹配中使用?我知道问题# 13620725 但它的解决方案不适用 afaik)
因此,正如您在示例代码和数据中看到的那样,我只需要找到那些将属性“class”设置为“req”(或“REQ”或“reQ”等)的 div,转换它们进入一个单独的新元素'NUEQ',并删除周围的表。但是对于任何其他 div(没有此特定属性),将标准转换为元素,但保留表格!
如您所见,我使用 translate() 使其不区分大小写,因此我不能在模板匹配中使用它。当然,我的普通 XSL 更长,过滤和转换许多其他元素和属性,但我将其提炼到本质。有没有人有想法可以帮助我?
一个xhtml测试数据文件:
<?xml version="1.0" encoding="UTF-8"?>
<html>
<head> <title></title> <style type="text/css"/></head>
<body>
<div class="somethingelse">inside std div with class</div>
<div style="page-break-after">inside std div with style</div>
<table><tbody><tr><th></th><td>
Normal Table Cell should be kept
</td></tr></tbody></table>
<table><tr><td>
<div class="req">
22
</div>
</td></tr></table>
<table><tr><td>
<div class="somethingelse">
44
</div>
</td></tr></table>
<table><tr><td>
<div >
keep div with no class 55
</div>
</td></tr></table>
<div> some additional data </div>
</body>
</html>
所需输出(奇怪的格式只是为了简洁和可见性):
<?xml version="1.0" encoding="UTF-8"?>
<segment>
<text class="somethingelse">inside std div with class</text>
<text style="page-break-after">inside std div with style</text>
<table><tbody><tr><th/><td>
Normal Table Cell should be kept with table
</td></tr></tbody></table>
<NUREQ number="22"/>
<table><tr><td>
<text class="somethingelse">
44
</text>
</td></tr></table>
<table><tr><td>
<text>
keep div with no class 55
</text>
</td></tr></table>
<text> some additional data </text>
我当前的 xslt 文件(没有必要的更改):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
<xsl:template match="/">
<segment>
<xsl:apply-templates />
</segment>
</xsl:template>
<xsl:template match="div">
<xsl:choose>
<xsl:when test="contains(translate(@class, $uppercase, $lowercase), 'somethingelse')">
<text class="{translate(@class, $uppercase, $lowercase)}">
<xsl:apply-templates/>
</text>
</xsl:when>
<xsl:when test="contains(translate(@style, $uppercase, $lowercase), 'page-break-after')">
<text style="{translate(@style, $uppercase, $lowercase)}">
<xsl:apply-templates/>
</text>
</xsl:when>
<xsl:otherwise>
<text>
<xsl:apply-templates/>
</text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="caption|tbody|thead|tr|table|th|td">
<xsl:element name="{name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我围绕以下代码片段进行了测试(比试验更多的错误),但它仍然
- 不使用 req 类(测试数据中的 22)切出 div 周围的表格
不为其他 div 执行 std 所需的转换 div=>text (44,55)
<xsl:template match = "table/tr/td/div"> <xsl:choose> <xsl:when test="contains(translate(@class, $uppercase, $lowercase), 'req')"> <xsl:element name="NUREQ"> <xsl:attribute name="number"> <xsl:value-of select="normalize-space(text())" /> </xsl:attribute> </xsl:element> </xsl:when> <xsl:otherwise> <xsl:apply-templates select="table"/> </xsl:otherwise> </xsl:choose> </xsl:template>