XSLT: отфильтровать результат кроме указанного списка - PullRequest
0 голосов
/ 29 ноября 2018

Я бы хотел отфильтровать элементы, кроме некоторых в списке.

У меня есть этот XML:

<catalog>
   <product>
      <code>Y17231</code>
      <pname>Test 1</pname>
   </product>
   <product>
      <code>Y19232</code>
      <pname>Test 2</pname>
   </product>
   <product>
      <code>Y18333</code>
      <pname>Test 3</pname>
   </product>
</catalog>

В настоящее время я отфильтровываю все элементы, которые не начинаются с Y19* code.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output encoding="UTF-8" indent="yes" method="xml"/>

    <xsl:strip-space elements="*" />

    <xsl:template match="node()|@*">
          <xsl:copy>
             <xsl:apply-templates select="node()|@*"/>
          </xsl:copy>
    </xsl:template>

    <xsl:template match="product[not(matches(code, 'Y[^X]?19.*[^V]$'))]" />

</xsl:stylesheet>

Это работает, xsltransform пример, пример вывода:

<catalog>
   <product>
      <code>Y19232</code>
      <pname>Test 2</pname>
   </product>
</catalog>

Цель:

Я хотел бы расширить это с помощью функции, где я могу определить некоторые коды, которые затем не будут отфильтрованы (они будут включены в результат).

<xsl:param name="include-this" as="xs:string*" select="'Y18333','Y16222','Y12333'"/>

Таким образом, вывод должен быть следующим:

<catalog>
   <product>
      <code>Y19232</code>
      <pname>Test 2</pname>
   </product>
   <product>
      <code>Y18333</code>
      <pname>Test 3</pname>
   </product>
</catalog>

Можете ли вы помочь мне, как достичь моей цели?

1 Ответ

0 голосов
/ 29 ноября 2018

Я думаю, что вы хотите использовать match="product[not(code = $include-this) and not(matches(code, 'Y[^X]?19.*[^V]$'))]".

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