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 완료. – 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)] 

일치하는 단어를 단어 경계로 사용한다고 가정합니다. "foo"가 "food"와 일치하도록하려면 와일드 카드를 사용할 수 있습니다.

+0

나는 이것에 대해 몰랐다. 감사합니다. 도움이 될 것입니다. – Joshhw