7

私は2つのシナリオで一致させようとしています:

  1. 文字列に数字以外の文字が含まれています
  2. 文字列が 8 文字を超えています。

したがって、XSLT は次のとおりです。

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="record[translate(employeeNumber, 'abcdefghijklmnopqrstuvwxyzABCDEFGHILKLMNOIPQRSTUVWXYZ!£$%^', '')]"/>
    <xsl:template match="record[string-length(employeeNumber) &lt; 9]"/>
</xsl:stylesheet>

テストデータは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<request>
    <records>
        <record>
            <employeeNumber>12345678</employeeNumber>
        </record>
        <record>
            <employeeNumber>1234567A</employeeNumber>
        </record>
        <record>
            <employeeNumber>12345678A</employeeNumber>
        </record>
        <record>
            <employeeNumber>123456789</employeeNumber>
        </record>
    </records>
</request>

これは返されるべきものです:

<?xml version="1.0" encoding="UTF-8"?>
<request>
    <records>
        <record>
            <employeeNumber>1234567A</employeeNumber>
        </record>
        <record>
            <employeeNumber>12345678A</employeeNumber>
        </record>
        <record>
            <employeeNumber>123456789</employeeNumber>
        </record>
    </records>
</request>

ただし、酸素で言ったように、エラーが発生しています:

Severity: warning Description: Ambiguous rule match for /request[1]/records[1]/record[1] Matches both "record[string-length(employeeNumber) < 9]" on line 13 of file:/C:/Users/mdown/Desktop/Untitled21.xsl and "record[translate(employeeNumber, 'abcdefghijklmnopqrstuvwxyzABCDEFGHILKLMNOIPQRSTUVWXYZ!£$%^', '')]" on line 12 of file:/C:/Users/mdown/Desktop/Untitled21.xsl

これは両方のルールに一致するためですが、これは問題ではありません。これらのオプションをサポートするには、XSLT をどのように変更すればよいでしょうか。

4

3 に答える 3

10

XSLT 仕様では、ノードが同じ優先度の複数のテンプレート ルールに一致する場合、それは「回復可能なエラー」であると述べています。実装は、エラーを無視して、最後に来るテンプレートを選択するか、それをハード エラーとして扱うことができます。Saxon では、これらのオプションのいずれかをコマンド ライン パラメータで選択できますが、デフォルトでは、警告を報告して続行する中間のオプションが選択されます。

この警告が表示されたら、2 つのルールを調べて、どちらを優先するかを決定することをお勧めします。次に、あいまいさがないように、両方のルールに明示的な優先度属性を指定します。

于 2012-05-10T21:32:41.057 に答える
10

エラーではなく、警告が表示されているように見えます。警告を回避したい場合は、どのテンプレートを優先するかを決定し、必要に応じて設定し<xsl:template match="foo" priority="5"/>ます。

于 2012-05-10T15:49:21.490 に答える
1

これが機能するかどうかはわかりませんが、最初のテンプレートの一致に長さの反対のチェックを追加してみてください

<xsl:template match="record
       [translate(employeeNumber, 'abcdefghijklmnopqrstuvwxyzABCDEFGHILKLMNOIPQRSTUVWXYZ!£$%^', '')]
       [string-length(employeeNumber) &gt;= 9]"/"/> 

<xsl:template match="record[string-length(employeeNumber) &lt; 9]"/> 

少し重複したコーディングですが、同じレコードと一致しないはずです。

于 2012-05-10T19:18:41.453 に答える