0

Mapforce で生成されたファイルを含むプロジェクトを引き継ぎました。私は次のようなものを読みました:

*[local-name()='no_regnat' and namespace-uri()=''][not((not((translate(string(@xsi:nil), 'true ', '1') = '1')) and (string(.) = '')))]

こんな感じで書けそうです

no_regnat[not((boolean(@xsi:nil) and (string(.) = '')))]

なぜ前者をやっているのですか?

4

1 に答える 1

1

まず、式の左辺を考えてみましょう。

*[local-name()='no_regnat' and namespace-uri()='']

no_regnat

ほとんどのコンテキストでは、これらはまったく同じ意味ですが、非常に特殊な状況では、同じ結果シーケンスが得られません。

xpath-default-namespaceXSLT 2.0 スタイルシートでを定義すると、式は同じ結果になりません。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="www.no_regnat.com">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
        <results>
            <xsl:apply-templates/>
        </results>
    </xsl:template>

    <xsl:template match="*[local-name()='no_regnat' and namespace-uri()='']">
       <!--Or: template match="no_regnat"-->
        <xsl:copy-of select="."/>
    </xsl:template>

</xsl:stylesheet>

たとえば、上記をテストします。

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:r="www.no_regnat.com">
    <no_regnat n="1"/>
    <r:no_regnat n="2"/>
    <other xmlns="www.no_regnat.com">
        <no_regnat n="3"/>
    </other>
</root>

ここでオンラインで直接変換します。

そのため、これらの式のコンテキストを確認して、Mapforce が実際に冗長すぎるコードを生成しているかどうかを判断する必要があります。


次に、2 番目の述語:

translate(string(@nil), 'true ', '1')

私の意見では、本当に奇妙ですこのtranslate()関数は単一の文字でしか機能しないため、translate()通常、 の 2 番目と 3 番目の引数である文字列は同じ長さになります。3 番目の引数に対応する文字がない 2 番目の引数の文字は、空の文字列に変換されます。

つまり、ここで関数が行っているのは、t1のマッピングruおよびeおよび(空白) を何もマッピングしないことです。boolean()ここでははるかに便利です。


ただし、これらの述語のセマンティクスには注意してください。

[not((not((translate(string(@xsi:nil), 'true ', '1') = '1')) and (string(.) = '')))]

意味

であり、コンテキスト要素の文字列値が空の場合xsi:nilは許可されませんfalse

一方

[not((boolean(@xsi:nil) and (string(.) = '')))]

意味

であり、コンテキスト要素の文字列値が空の場合xsi:nilは許可されませんtrue

ほとんどの場合、正しい制約は次のとおりです。if の場合xsi:nil = 'true'、コンテキスト要素は空でなければなりません。

于 2015-03-30T15:52:16.123 に答える