-1

こんにちは、次のような 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!£$%^', '')]" priority="1"/>
    <xsl:template match="record[string-length(employeeNumber) &lt; 8]" priority="2"/>
</xsl:stylesheet>

ご覧のとおり、条件に一致させるには、文字または特殊文字を含めてはならず、8 文字よりもはるかに大きくする必要があります。したがって、この XML を使用する場合:

<?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 が返されます。

<?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>

ただし、実際には次のように返されます。

<?xml version="1.0" encoding="UTF-8"?>
<request>
    <records/>
</request>

一致しない理由:

  1. 文字だけを探して
  2. 8 を超える文字の 2 番目の一致を使用していませんか?
4

3 に答える 3

1

これを使って

<xsl:template match="record[string-length(employeeNumber) &lt;= 8]
                           [translate(employeeNumber, '0123456789', '') = '']
" />
于 2012-05-11T10:42:14.530 に答える
1

これはどう

<xsl:template match="record[
  not(
    string-length(employeeNumber) &gt;= 8
    and
    translate(employeeNumber, '0123456789', '') = ''
  )
]" />

このタスクには 2 つのテンプレートは必要なく、テンプレートの優先度も必要ありません。

上記は以下を生成します。

<request>
  <records>
    <record>
      <employeeNumber>12345678</employeeNumber>
    </record>
    <record>
      <employeeNumber>123456789</employeeNumber>
    </record>
  </records>
</request>

これはあなたの要件と一致しています

  • 文字または特殊文字を含めることはできません
  • 8 文字以上である必要があります
于 2012-05-11T10:45:00.553 に答える
0

文字列の長さが 8 未満の従業員番号がないため、string-length(employeeNumber) < 8 テンプレートは一致しません。

translate() テンプレートはすべてのレコードに一致します。これは、すべての従業員番号に、translate() によって除去されない文字 (数字) が少なくとも 1 つ含まれているためです。(そのため、変換の結果は、ブール値が true である空でない文字列になります)。

(注: Saxon にはオプション -T があり、どの要素がどのテンプレート ルールに一致するかをトレースします。これは、この種のデバッグに非常に役立ちます)

于 2012-05-11T11:47:30.890 に答える