1

我是 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> 
    
4

1 回答 1

0

您需要 XPath 来完成您正在寻找的工作。它必须在表格元素级别完成,因为这是您希望阻止显示的元素,但仅在一个实例中。我现在为表格元素分离出一个模板。

<xsl:template match="caption|tbody|thead|tr|th|td">
    <xsl:element name="{name()}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="table">
    <xsl:choose>
        <xsl:when test=".//div[translate(@class, $uppercase, $lowercase)='req']">
            <xsl:element name="NUREQ">
                <xsl:attribute name="number">
                    <xsl:value-of select="normalize-space(.//div)" />
                </xsl:attribute>
            </xsl:element>
        </xsl:when>
        <xsl:otherwise>
            <xsl:element name="table">
                <xsl:apply-templates/>
            </xsl:element>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

我希望这有帮助。

于 2013-10-25T17:50:47.007 回答