xpath combo содержит / перевод не работает должным образом

От поиска через stackru я нашел решение для использования 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 сейчас. Я использую marklogic для этих вызовов xpath. Вот пример 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>

1 ответ

Решение

Вы добавили MarkLogic в качестве тега, поэтому, если вы используете MarkLogic, вы можете использовать его текстовые функции, предназначенные для таких вещей:

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

Это предполагает, что вы хотите, чтобы совпадение было на границах слов. Если вы действительно хотите, чтобы "foo" соответствовал "food", вы можете использовать подстановочные знаки.

Другие вопросы по тегам