2

大文字と小文字を区別しないXML検索を実行する必要があります。正常に機能するXPath式を作成しましたが、XPath式内で関数を使用するtranslateと、エラーが発生します。以下は、正常に機能しているXPath式です。

string upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string lower = "abcdefghijklmnopqrstuvwxyz";

string xpath = "/data/item[AID/@iskey='true' and AID/text() = 'fep'][not(*[@iskey][local-name() != 'AID' ])]";       

string xpath1 = "/data/item[translate('Aid','" + upper + "','" + lower + "')]";

そして、これが私のXMLです。

<?xml version="1.0" encoding="utf-8"?>
<data>
<item>
 <AID iskey="true">fep</AID>
  <account>MS</account>
  </item>
</data>

translate次のように、最初のXPath式に関数を配置します。

 string xpath = "/data/item[translate('AID','" + upper + "','" + lower + "')/@iskey='true' and translate('AID','" + upper + "','" + lower + "')/text() = 'fep'][not(*[@iskey][local-name() != translate('aid','" + upper + "','" + lower + "') ])]";

これを行うと、次のエラーが発生します。

式はノードセットに評価される必要があります。

このxpathは私にとってはうまく機能しています。

 string col="AID"; 
 string xpath = "/data/item[col/@iskey='true' and col/text() = 'fep'][not(*[@iskey][local-name() != 'col' ])]";   

ここで、col値は大文字でも小文字でもかまいません。そのため、データがxmlに存在するかどうかに関係なく、結果を返すxpathを変更する必要があります。ユーザーが援助または援助またはaiDを与えると、結果が返されます。

4

2 に答える 2

1

このエラーは、XPath式に次のようなロケーションステップがあるためです。

item['aid'/@isKey = 'true' ...]

部分式:

'aid'/@isKey

演算子の左側は/ノードセットでなければならないため、XPathでは構文的に不正です。ここでは単なる文字列です。

現在生成しているものではなく、次のようなXPath式が必要です

/data/item
       [*[translate(name(), 'aid', 'AID') = 'AID']/@iskey='true'
      and
        *[translate(name(), 'aid', 'AID') = 'AID'] = 'fep'
         ]
          [not(*[@iskey]
                [translate(name(), 'aid', 'AID') != 'AID']
             )
         ]

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:variable name="vLower" select="'aid'"/>
 <xsl:variable name="vUpper" select="'AID'"/>

 <xsl:template match="node()|@*">
     <xsl:copy-of select=
      "/data/item
           [*[translate(name(), 'aid', 'AID') = 'AID']/@iskey='true'
          and
            *[translate(name(), 'aid', 'AID') = 'AID'] = 'fep'
             ]
              [not(*[@iskey]
                    [translate(name(), 'aid', 'AID') != 'AID']
                 )
             ]
      "/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合:

<data>
    <item>
        <AID iskey="true">fep</AID>
        <account>MS</account>
    </item>
</data>

XPath式が評価され、選択されたノード(この場合は1つだけ)が出力にコピーされます

<item>
   <AID iskey="true">fep</AID>
   <account>MS</account>
</item>

更新

OPはこのソリューションを理解するのが困難です。これは、ソリューションが文字列「aid」の任意の大文字化に対して機能することを彼に示す例です。

上記の変換がXMLドキュメントに適用されると、「aid」を大文字にした要素名が含まれます。たとえば、次のようになります。

<data>
    <item>
        <aId iskey="true">fep</aId>
        <account>MS</account>
    </item>
</data>

再び期待される結果が生成されます:

<item>
   <aId iskey="true">fep</aId>
   <account>MS</account>
</item>

アップデート2

OPはまだ解決策を理解しておらず、特定のXMLドキュメント(以下に提供)に対して「私はあなたの式を使用しましたが、nullを返します」と主張しています。

OPのコメントで提供されているXMLドキュメントは次のとおりです。

<data>
    <item>
        <aId iskey="true">fep</aId>
        <account>FG</account>
    </item>
</data>

このドキュメントに対して同じXSLT検証が実行されると、再び正しい要素が選択されて出力されます

<item>
   <aId iskey="true">fep</aId>
   <account>FG</account>
</item>
于 2012-07-06T16:20:41.233 に答える
0

を使用する代わりにtranslate()、ユニオンを使用してみてください。(aid|AID)

新しいxpath:

/data/item[(aid|AID)/@iskey='true' and (aid|AID)/text() = 'fep'][not(*[@iskey][local-name() != 'AID' and local-name() != 'aid'])]
于 2012-07-06T15:33:48.043 に答える