1

私はどちらかというと XSLT の初心者ですが、次の問題を解決する必要があり、StackOfJoel の明るい頭脳の一部が私を助けてくれることを願っています。要件は次のとおりです。

  • 特定の div 要素 (特定の属性値を持つ) は常にテーブルに含まれます。div を新しい要素 (NUREQ) に転送し、周囲のすべてのテーブル構造を削除する必要があります
  • 他のテーブルは保持する必要があり、他の div は切り取らずに、別の要素 (テキスト) に変換する必要があります。

問題は次のとおりです: 属性値の一致で大文字と小文字を区別しないようにする必要があるため、テンプレートの一致で属性を直接一致させることはできません (私は変換を使用します - テンプレート一致で直接使用できる他の方法はありますか? 私は質問について知っています#13620725しかし、その解決策は適用されません)

したがって、コード例とデータでわかるように、属性「クラス」が「req」(または「REQ」、または「reQ」など) に設定されている div のみを見つけて、それらを変換する必要があります。別の新しい要素「NUREQ」に変換し、周囲のテーブルを削除します。ただし、他の div (この特定の属性なし) については、要素への標準的な変換を行いますが、テーブルは保持してください!

ご覧のとおり、translate() を使用して大文字と小文字を区別しないようにしているため、テンプレート マッチでは使用できません。もちろん、私の通常の XSL ははるかに長く、他の多くの要素と属性をフィルター処理して変換しますが、それを本質まで抽出しました。誰かがアイデアを持っていて、それで私を助けることができますか?

1 つの 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-class (testdata の 22) で div の周りのテーブルを切り取らない
  • 他の div (44,55) の std に必要な変換 div=>text を実行しません

        <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 が必要です。テーブル要素レベルで実行する必要があります。これは、表示を防止しようとしている要素であるためです。ただし、1 つのインスタンスでのみです。テーブル要素のテンプレートを分離しました。

<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 に答える