2017-03-22 60 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