Сплит методы в XPath 1.0 - PullRequest
       21

Сплит методы в XPath 1.0

0 голосов
/ 01 апреля 2019

Я использую 'XPath', как я могу симулировать метод разделения?

Я прочитал документацию и знаю, что XPath версии 1.0 не имеет этого метода.

У меня есть документ, содержащий следующие теги:

<TestCategoryModule>
   <ItemCategories>
      <![CDATA[Birthday Travel,Travel]]>
   </ItemCategories>
</TestCategoryModule>

<TestCategoryModule2>
   <ItemCategories>
      <![CDATA[Travel]]>
   </ItemCategories>
</TestCategoryModule2>

Я хочу отфильтровать элемент по 'ItemCategories', но когда я отфильтрую по миру 'Путешествия', верните 2 элемента. Я использую этот фильтр "ItemCategories [содержит (text (), 'Путешествия')]".

Я хочу, чтобы я отфильтровал по «Путешествию» возврат только второго элемента. Как это сделать?

Ответы [ 3 ]

1 голос
/ 01 апреля 2019

Использование:

/*/*/*[contains(concat(',', ., ','), ',Travel,')]

Вот проверка на основе XSLT :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/">
    <xsl:copy-of select=
     "/*/*/*[contains(concat(',', ., ','), ',Travel,')]"/>
  </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к этому документу XML (по сути, предоставленный фрагмент XML, расширенный еще одним контрольным примером и сформировавший правильно сформированный документ XML:

<t>
    <TestCategoryModule>
        <ItemCategories>Birthday Travel,Travel</ItemCategories>
    </TestCategoryModule>
    <TestCategoryModule2>
        <ItemCategories>Birthday Travel</ItemCategories>
    </TestCategoryModule2>
    <TestCategoryModule2>
        <ItemCategories>Travel</ItemCategories>
    </TestCategoryModule2>
</t>

Требуется правильный результат :

<ItemCategories>Birthday Travel,Travel</ItemCategories>
<ItemCategories>Travel</ItemCategories>
0 голосов
/ 01 апреля 2019

Я немного ошибся или плохо описал проблуму. Проблема в том, что категории хранятся в виде строки. У меня есть три пункта, первый содержит категории: (День рождения путешествия, путешествия), второй: (День рождения путешествия), третий: (Путешествия). Когда я запрашиваю фильтрацию по слову «Путешествия», мне нужно получить первый и третий элементы, но я получаю все три элемента, потому что все элементы содержат мир «Путешествия».

0 голосов
/ 01 апреля 2019

Вам на самом деле не нужно split() для проблемы, которую вы описали.Если вы хотите соответствовать Travel, но не Travel,Travel, вам нужно = вместо contains().Чтобы устранить пробелы вокруг разделов CDATA, оберните их в normalize-space().

Все вместе, попробуйте ItemCategories[normalize-space(text()) = 'Travel'].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...