2017-03-22 6 views
-1

xpathを使用して大文字と小文字を区別しない検索ができるソリューションが見つかりました。私は最近、スキーマをいくつか変更しました。私が検索に戻ったとき、私はこのアプローチを使うときに何も見つけませんでした。ここに私のスキーマは次のとおりです。xpathコンボが正しく動作しません。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="system"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="pData"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="pData"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="pNum"/> 
     <xs:element ref="sData"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="pNum" type="xs:integer"/> 
    <xs:element name="sData"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="sNum"/> 
     <xs:element maxOccurs="unbounded" ref="hData"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="sNum" type="xs:NMTOKEN"/> 
    <xs:element name="hData"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="hTitle"/> 
     <xs:element ref="bData"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="hTitle" type="xs:string"/> 
    <xs:element name="bData"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" ref="sitData"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="sitData" > 
    <xs:complexType mixed="true"> 
     <xs:sequence> 
     <xs:element ref="sitTitle"/> 
     <xs:element minOccurs="0" ref="sitInfo"/> 
     <xs:choice> 
      <xs:element ref="bothColumn"/> 
      <xs:sequence> 
      <xs:element ref="leftColumn"/> 
      <xs:element ref="rightColumn"/> 
      </xs:sequence> 
     </xs:choice> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="sitTitle" type="xs:string"/> 
    <xs:element name="sitInfo" type="xs:string"/> 
    <xs:element name="bothColumn"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="bothTitle"/> 
     <xs:element ref="bothInfo"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="bothTitle" type="xs:string"/> 
    <xs:element name="bothInfo" type="xs:string"/> 
    <xs:element name="leftColumn"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="leftTitle"/> 
     <xs:element ref="leftInfo"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="leftTitle" type="xs:string"/> 
    <xs:element name="leftInfo" type="xs:string"/> 
    <xs:element name="rightColumn"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="rightTitle"/> 
     <xs:element ref="rightInfo"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="rightTitle" type="xs:string"/> 
    <xs:element name="rightInfo" type="xs:string"/> 
</xs:schema> 

だから私の元の検索は次のようになります。

return $doc/system/pData/sData/hData/bData/sitData[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),$searchTerm)] 

ので、私の問題は、私は、「システム」と言う用語を検索するとき、私はデータが存在することがわかっているとき、何が出てくるんでしょうが発生しますそこには、私が "システム"を検索すると、システムのすべてのバージョンが戻ってきます。私はこの問題を持つ他の誰かを見つけることができなかった。そして、検索はまだ大文字と小文字を区別しないので、私は困惑し、xpath検索で何が起きているのか理解したい。私はこれらのxpath呼び出しのためにmarklogicを利用しています。ここでは、このスキーマに合うサンプルXMLです:

<system> 
    <pData> 
     <pNumber>908957303</pNumber> 
     <sData> 
      <sNumber>12345</sNumber> 
      <hData> 
       <hTitle>What to expect</hTitle> 
       <bData> 
        <sitData> 
         <sitTitle>A whole lot of fun</sitTitle> 
         <sitInfo> defined fun</sitInfo> 
         <leftColumn> 
          <leftTitle>to the left</leftTitle> 
          <leftInfo> all your clothes </leftInfo> 
         </leftColumn> 
         <rightColumn> 
          <rightTitle>to the right</rightTitle> 
          <rightInfo> right hand turns </rightInfo> 
         </rightColumn> 
        </sitData> 
        <sitData> 
         <sitTitle>we out here</sitTitle> 
         <sitInfo> doing this is painful </sitInfo> 
         <bothColumn> 
          <bothTitle>2001 was a good year</bothTitle> 
          <bothInfo>but it did have some downfalls</bothInfo> 
         </bothColumn> 
        </sitData> 
       </bData> 
      </hData> 
      <hData> 
       <hTitle>What to expect</hTitle> 
       <bData> 
        <sitData> 
         <sitTitle>A whole lot of fun</sitTitle> 
         <sitInfo> defined fun</sitInfo> 
         <leftColumn> 
          <leftTitle>to the left</leftTitle> 
          <leftInfo> all your clothes </leftInfo> 
         </leftColumn> 
         <rightColumn> 
          <rightTitle>to the right</rightTitle> 
          <rightInfo> right hand turns </rightInfo> 
         </rightColumn> 
        </sitData> 
        <sitData> 
         <sitTitle>we out here</sitTitle> 
         <sitInfo> doing this is painful </sitInfo> 
         <bothColumn> 
          <bothTitle>2001 was a good year</bothTitle> 
          <bothInfo>but it did have some downfalls</bothInfo> 
         </bothColumn> 
        </sitData> 
       </bData> 
      </hData> 
     </sData> 
    </pData> 
</system> 
+0

問題を説明する[mcve]を投稿してください。 XMLを見ることなく、問題を検証することはできません。 – kjhughes

+0

@kjhughes done。 – Joshhw

+0

確認できません。 '$ searchTerm'の' 'System ''を' 'System ''を差し込むと、大文字と小文字の区別なくXMLにその文字列が存在しないので、何も選択しません。 ''全体を ''を差し込むと、大文字小文字に関係なく、その文字列を含む2つの 'sitData'が見つかります。 **あなたの問題はあなたが投稿したもので確認することはできません** – kjhughes

答えて

3

あなたはタグとしてMarkLogicを追加しましたので、あなたはMarkLogicを使用している場合は、このようなもののために設計されたテキスト機能活用することができます

let $doc := ... 
let $q := cts:word-query($searchTerm, "case-insensitive") 
return $doc//sitData[cts:contains(., $q)] 

これは、単語の境界にマッチすることを前提としています。 "foo"が "food"にマッチするようにしたいのであれば、ワイルドカードを使うことができます。

+0

私はこれについて知らなかった。ありがとう、これは助けになるでしょう。 – Joshhw

関連する問題