2017-03-22 32 views
-1

從通過stackoverflow搜索我找到了一個解決方案,使用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完成。 – Joshhw

+0

無法驗證。在'$ searchTerm'中插入''System''就不會選擇任何內容,因爲該字符串不存在於您的XML中,無論大小寫。插入「整個」會找到兩個包含該字符串的「sitData」,無論大小寫如何,都應如此。 **您的問題無法通過您發佈的內容進行驗證。** – kjhughes

回答

3

您加入MarkLogic作爲標記,因此,如果您正在使用MarkLogic,你可以利用它的文本功能專爲這樣的事情:

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

這假設你想要匹配在單詞邊界上。如果你真的想要「富」匹配「食物」,那麼你可以使用通配符。

+0

我不知道這件事。謝謝,這會有所幫助。 – Joshhw